Elasticsearch查询以查找应查询的匹配词条数量

时间:2018-08-05 06:24:10

标签: elasticsearch

我正在寻找您的帮助,以解决以下问题:

此查询是什么:   查询以检查关键字是否存在五个字段中的任何一个(例如街道,城市,姓氏,国家/地区,大陆)   所以我想检查那些具有美国或英国的字段

我正在寻找帮助的东西。

获得分数2:     如果在这五个(“街道”,“城市”,“姓氏”,“国家”,“大陆”)字段中的任何一个中都找到了两个关键字“美国”,“英国”

获得分数1:    如果在以下五个字段(“街道”,“城市”,“姓氏”,“国家”,“大陆”)中的任何一个中找到“美国”,“英国”中的任何一个关键字

获得分数0:      如果在这五个(“街道”,“城市”,“姓氏”,“国家”,“大陆”)字段中的任何一个中都没有找到这些关键词“美国”,“英国”

这样我就可以在前端结果中显示0/2或1/2或2/2

现有查询:

GET  main_index/_doc/_search
{
  "query": {
    "bool": { 
      "should": [
        { 
          "multi_match": {
            "fields": ["street","city","lastname","country","continent"],
            "query": "united states", 
            "type": "phrase"
          }
        },
        { 
           "multi_match": { 
             "fields": ["street","city","lastname","country","continent"],
             "query": "united kingdom",   
             "type": "phrase"
           }
        }]
     }
   }
}

1 个答案:

答案 0 :(得分:1)

有两种解决方法。

(注意:我简化了以下查询,以在单个address字段上进行查询,但是原理保持不变)

1。命名查询+应用程序逻辑

如评论中的Val所示,您可以使用命名查询(例如,将其命名为us-queryuk-query)来知道哪个项目与哪个查询匹配。

然后,您可以让您的应用程序代码解析每个结果的matched_queries字段,以了解匹配的查询并分配相关分数,然后再将结果返回到前端:

{
  "query": {
    "bool": { 
      "should": [
        { 
          "multi_match": {
            "fields": ["address"],
            "query": "united states", 
            "type": "phrase",
            "_name": "us-query"
          }
        },
        { 
           "multi_match": { 
             "fields": ["address"],
             "query": "united kingdom",   
             "type": "phrase",
             "_name": "uk-query"
           }
        }]
     }
   }
}

2。功能得分

您可以将script_score类型的function scorefilter参数一起使用,为每个查询分配正确的分数。 我个人不喜欢这种解决方案,因为它使用过于复杂的查询来获得相当简单的结果,并在查询中引入了一些重复。

{
  "query": {
        "function_score": {
            "query": { "match_all": {} },
            "functions": [
                {
                    "filter": {
                        "multi_match": {
                        "fields": ["address"],
                        "query": "united states", 
                        "type": "phrase",
                      }
                    },
                    "script_score" : {
                        "script" : {
                          "source": "1"
                        }
                    }
                },
                {
                    "filter": {
                        "multi_match": {
                        "fields": ["address"],
                        "query": "united kingdom", 
                        "type": "phrase",
                      }
                    },
                    "script_score" : {
                        "script" : {
                          "source": "1"
                        }
                    }
                },
                {
                    "filter": {
                        "bool": {
                            "must": [
                                {
                                    "multi_match": {
                                        "fields": ["address"],
                                        "query": "united kingdom", 
                                        "type": "phrase",
                                    }
                                },
                                {
                                    "multi_match": {
                                        "fields": ["address"],
                                        "query": "united states", 
                                        "type": "phrase",
                                    }
                                }
                            ]   
                        }
                    },
                    "script_score" : {
                        "script" : {
                          "source": "2"
                        }
                    }
                }
            ]
        }
    }
}