目标
我想执行一个elasticsearch查询,按首选(名)和姓搜索索引。
我正在寻找的结果如下:
姓名1:乔什·艾伦姓名2:约瑟夫·奥尔布赖特姓名3:Jose Abreu姓名4:阿伦·艾弗森
查询"Jos *"应返回名称1、名称2和名称3。
查询"Josh *"应仅返回Name1。
查询"Josh Al *"也应该只返回Name1,而不应该返回Name4。
问题
prefName
和lastName
是索引中的两个独立字段,这似乎使事情变得有点棘手。
索引定义
{
"employee-profile2020.11.16": {
"aliases": {
"employeeprofile": {}
},
"mappings": {
"dynamic": "false",
"properties": {
"jobFamilyGroup": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"personDTO": {
"properties": {
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"prefName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"status": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
}
}
}
}
尝试
我想我已经接近使用query_string的解决方案了。下面是我正在执行的查询,它通过prefName和lastName查找具有特定jobFamilyGroup的活动用户:
{
"query": {
"bool": {
"must": [
{
"match": {
"personDTO.status": "A"
}
},
{
"wildcard": {
"jobFamilyGroup": {
"value": "athlete"
}
}
},
{
"query_string": {
"query": "Allen Ive*",
"fields": [
"personDTO.prefName^3",
"personDTO.lastName"
]
}
}
]
}
}
}
结果同时返回"阿伦·艾弗森"和"乔什·阿伦"。提高persondto. prefname的得分似乎有点帮助,但我只希望阿伦·艾弗森回到这里,因为prefname是在空间之前建立的。
有没有办法进一步过滤这些结果,只给我prefName中的"Allen",而不是同时查看prefName和lastName?如果需要更多信息,请告诉我。谢谢。
1条答案
按热度按时间ie3xauqp1#
当您使用query_string在两个字段中搜索某个术语时,将使用OR逻辑。使用此逻辑,将返回prefName或lastName字段中包含艾伦的文档。轻松解决此问题的一种方法是将default_operator更改为“AND”。AND将仅匹配prefName和lastName中匹配的术语
但是,如果您希望具有OR行为,则这可能会产生影响。
另一个解决方案是创建一个管道来设置带有prefName + lastName组合的新字段.“full_name”。通过这个新字段,您可以在query_string中使用它。