首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elasticsearch查询以查找应该查询中的匹配项数

Elasticsearch查询以查找应该查询中的匹配项数
EN

Stack Overflow用户
提问于 2018-08-05 06:24:09
回答 1查看 283关注 0票数 0

我正在寻求您的帮助,以建立一个解决方案如下:

这个查询是什么:查询检查是否存在关键字,以检查这五个字段(如街道、城市、姓氏、国家、大陆)中的任何一个,以便检查其中任何一个具有美国或英国的字段。

我所寻求的帮助。

得分2:如果在这五个领域(“街道”、“城市”、“姓氏”、“乡村”、“大陆”)的任何人都发现了“美国”、“英国”这两个关键词

得分1:如果在这五个领域(“街道”、“城市”、“姓氏”、“国家”、“大陆”)中发现的任何一个关键词“美国”、“英国”

得分0:如果在这五个领域(“街道”、“城市”、“姓氏”、“国家”、“大陆”)中没有一个关键词“美国”、“英国”被发现

以便在前端显示0/2或1/2或2/2的结果。

存在性查询:

代码语言:javascript
复制
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"
           }
        }]
     }
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-05 14:10:10

解决这个问题有两种方法。

(注意:我将下面的查询简化为对单个address字段进行查询,但原则保持不变)

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

正如Val在注释中提到的,您可以使用命名查询(例如,命名它们为us-queryuk-query)来知道哪个项与哪个查询匹配。

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

代码语言:javascript
复制
{
  "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,结合filter参数,为每个查询分配正确的分数。我个人不喜欢这个解决方案,因为它使用过于复杂的查询来实现相当简单的结果,并在查询中引入了一些重复。

代码语言:javascript
复制
{
  "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"
                        }
                    }
                }
            ]
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51691917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档