在ElasticSearch查询中搜索多个字段

lf3rwulv  于 2023-01-16  发布在  ElasticSearch
关注(0)|答案(1)|浏览(218)

目标

我想执行一个elasticsearch查询,按首选(名)和姓搜索索引。
我正在寻找的结果如下:
姓名1:乔什·艾伦姓名2:约瑟夫·奥尔布赖特姓名3:Jose Abreu姓名4:阿伦·艾弗森
查询"Jos *"应返回名称1、名称2和名称3。
查询"Josh *"应仅返回Name1。
查询"Josh Al *"也应该只返回Name1,而不应该返回Name4。

问题

prefNamelastName是索引中的两个独立字段,这似乎使事情变得有点棘手。

索引定义

{
    "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?如果需要更多信息,请告诉我。谢谢。

ie3xauqp

ie3xauqp1#

当您使用query_string在两个字段中搜索某个术语时,将使用OR逻辑。使用此逻辑,将返回prefName或lastName字段中包含艾伦的文档。轻松解决此问题的一种方法是将default_operator更改为“AND”。AND将仅匹配prefName和lastName中匹配的术语

{
           "query_string": {
             "query": "Allen Ive*",
             "default_operator": "AND",
             "fields": [
               "personDTO.prefName^3",
               "personDTO.lastName"
             ]
           }
         }

但是,如果您希望具有OR行为,则这可能会产生影响。
另一个解决方案是创建一个管道来设置带有prefName + lastName组合的新字段.“full_name”。通过这个新字段,您可以在query_string中使用它。

相关问题