Почему эластичный поиск возвращает нерелевантные результаты с операторами «ИЛИ»? - PullRequest
0 голосов
/ 14 июня 2019

Ниже приведены два документа:

Документ-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" ]
}

Query1:

{
    "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"
                                 }
                             }
                             ]
                }
        }

как мы видим, что в результатах первый документ имеет самый высокий балл, я не понял, почему это происходит. Если мы увидим второй документ , он более актуален, чем первый документ .

Query2:

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

Но при выполнении query2 он дает мне правильный результат, как я и ожидал. Пожалуйста, кто-нибудь, помогите мне ...

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Я предполагаю, что вы хотите отфильтровать несовпадающие документы из всего населения из-за использования тегов.В этом сценарии вы бы точно собрались, верно?Если это так, я предлагаю вам сначала индексировать поле типа массива как 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"
}
....
0 голосов
/ 14 июня 2019

Это потому что поле короче. Я бы рекомендовал чтение на BM25 (который является текущим алгоритмом оценки по умолчанию для ES.

Вы можете использовать объяснение api , чтобы выяснить, как оцениваются отдельные компоненты алгоритма. Это поможет вам понять, почему один документ отображается над другим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...