【问题标题】:Find out which fields matched in a multi match query找出在多重匹配查询中匹配的字段
【发布时间】:2014-08-27 21:35:09
【问题描述】:

我在三个字段上使用典型的多重匹配查询:姓名、城市、州。多重匹配查询也使用 Java 函数评分脚本。有什么方法可以在分数脚本中知道哪些字段与我的多匹配查询匹配?如果没有,有什么方法可以从 SearchResponse 对象中解决这个问题?

我目前使用的是 Elasticsearch 1.2.1,但如有必要,我可以轻松升级。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我不相信你可以直接使用多重匹配来做到这一点,但如果你添加突出显示,你应该会得到一个显示哪些字段匹配的响应:

    http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/highlighting-intro.html

    在此页面的示例中:

        GET /megacorp/employee/_search
        {
            "query" : {
                "match_phrase" : {
                    "about" : "rock climbing"
                }
            },
            "highlight": {
                "fields" : {
                    "about" : {}
                }
            }
    
    }
    

    您可以将 match_phrase 更改为 multi_match 并添加字段列表:

        GET /megacorp/employee/_search
        {
            "query" : {
                "multi_match" : {
                    "query" : "rock climbing",
                    "fields": ["about", "otherfield"]
                }
            },
            "highlight": {
                "fields" : {
                    "about" : {},
                     "otherfield": {}
                }
            }
    
    }
    

    这应该会为您提供一个突出显示响应,其中包括匹配文本周围的突出显示和匹配的字段。

    【讨论】:

    • 这是一个不错的选择,但不能通过自定义评分脚本访问它吗?
    【解决方案2】:

    还有另一种准确的方法可以找出查询中匹配的字段

    因为高亮是后期高亮过程,所以不准确,因为它这样做的方式

    只需使用命名查询来代替多重匹配

    比如

      {
        "multi_match" : {
          "query" : "query phrase here",
          "fields" : [ "name", "tag", "categorys" ],
          "operator" : "AND"
      }
    

    将其翻译成带有名称的布尔查询

        "should": [
            {
                "match": {
                   "name": {
                        "query": "query phrase here",
                        "_name":"name_field"
                   }
                }
            },{
                "match": {
                   "tag":{
                        "query": "query phrase here",
                        "_name":"tag_field"
                   }
                }   
            },{
                "match": {
                   "categorys":{
                        "query": "query phrase here",
                        "_name":"cat_field"
                   }
                }
            }
         ]
    

    它会返回这样的结果

         {
            "_index": "indexName",
            "_type": "type",
            "_id": "id",
            "_score": 0.27836448,
            "matched_queries": [
               "tag_field"
            ]
         },
         {
            "_index": "indexName",
            "_type": "type",
            "_id": "id",
            "_score": 0.27836448,
            "matched_queries": [
               "name_field",
               "tag_field"
            ]
         }
    

    【讨论】:

    • multi_match 类型为“cross_fields”时如何适配有什么建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多