为什么Elasticsearch与运算符“ OR”返回无关的结果?

时间:2019-06-14 15:18:44

标签: elasticsearch

下面是两个文档:

文档1:

{
  "type": "document",
  "name": "Meter testing practice",
  "id": "cd1269",  
  "tags": [ "METER TESTING PRACTICE" ]
}

文档2:

{
  "type": "document",
  "name": "Single phase meter",
  "id": "cd1271",
  "tags": [ "SINGLE PHASE METER", "SINGLE PHASE METER INSTALLATION",
            "TOOLS FOR METER INSTALLATION" ]
}

查询1:

{
    "query": {
        "match" : {
            "tags" : {
                "query" : "SINGLE PHASE METER"
            }
        }
    }
}

执行 query1 时,它返回以下结果:

结果:

{
                "took": 0,
                "timed_out": false,
                "_shards": {
                    "total": 5,
                    "successful": 5,
                    "skipped": 0,
                    "failed": 0
                },
                "hits": {
                    "total": 2,
                    "max_score": 1.2655861,
                    "hits": [
                             {
                                 "_shard": "[document_org4][4]",
                                 "_node": "YgzzS4wzQQKpdHxvsbVzPA",
                                 "_index": "document_org4",
                                 "_type": "document",
                                 "_id": "cd1269",
                                 "_score": 1.2655861,
                                 "_source": {
                                     "tags": [ "METER TESTING PRACTICE" ],
                                     "type": "document",
                                     "name": "Meter testing practice",
                                     "id": "cd1269"
                                 }                          
                             },
                             {
                                 "_shard": "[document_org4][3]",
                                 "_node": "YgzzS4wzQQKpdHxvsbVzPA",
                                 "_index": "document_org4",
                                 "_type": "document",
                                 "_id": "cd1271",
                                 "_score": 0.8617958,
                                 "_source": {
                                     "tags": [ "SINGLE PHASE METER", "SINGLE PHASE METER INSTALLATION", "TOOLS FOR METER INSTALLATION" ],
                                     "type": "document",
                                     "name": "Single phase meter",
                                     "id": "cd1271"
                                 }
                             }
                             ]
                }
        }

正如我们看到的那样,在结果第一个文档中得分最高,我不明白为什么会这样。如果我们看到第二份文档,则它与第一份文档更相关。

查询2:

{
    "query": {
        "match" : {
            "tags" : {
                "query" : "SINGLE PHASE METER",
                "operator": "AND"
            }
        }
    }
}

但是当执行 query2 时,它给了我预期的正确结果。请有人帮我...

2 个答案:

答案 0 :(得分:0)

这是因为字段较短。我建议使用reading up on BM25(这是ES的当前默认评分算法。

您可以使用explain api来找出算法得分的各个组成部分。这将帮助您弄清楚为什么一个文档出现在另一个文档上方

答案 1 :(得分:0)

我假设您正在由于使用标签而希望从整个人群中筛选出不匹配的文档。在这种情况下,您将要进行完全匹配,对吗? 如果是这种情况,我建议您首先将数组数据类型字段索引为“ KEYWORD”。 然后,您可以进行字词查询:

{
   "query":{
      "bool":{
         "must":{
            "match_all":{}
         },
         "filter":{
            "bool":{
               "must":[
                  {
                  "term": {
                    "tags.keyword": "single phase meter"
                  }
                }
               ]
            }
         }
      }
   }
}

如果您想对关键字字段进行汇总或排序而不会遇到奇怪的结果,则可能需要对其进行标准化。在此示例中,该字段在索引时间标准化为小写。

...
tags:{
  "fields":{
        "keyword":{
          "type":"keyword"
        }
   }
}
...

为使此示例正常工作,您需要在映射中创建一个关键字字段。请记住,关键字字段区分大小写。您需要在查询时使用完全相同的拼写,以使其匹配。如果您不对输入进行标准化,则需要使用大写拼写。

...
"term": {
     "tags.keyword": "SINGLE PHASE METER"
}
....