Elasti c Поиск по поисковой фразе -> результат не предсказуем - PullRequest
4 голосов
/ 29 марта 2020

Образец до c

{
  "id": 5,
  "title": "Quick Brown fox jumps over the lazy dog",
  "genre": [
    "fiction"
  ]
}

Отображение

{
  "movies" : {
    "mappings" : {
      "properties" : {
        "genre" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "id" : {
          "type" : "long"
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Запрос1: Результаты в ранее опубликованном документе

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "fox quick over", "slop": 3
     }
   }
 } 
}

Запрос2: Нет результатов

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "over fox quick", "slop": 3
     }
   }
 } 
}

Я ожидал результата в запросе 2, а не в запросе 1.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Отклонение

Сколько раз вам нужно переместить термин, чтобы привести запрос и документ в соответствие.

Переключение порядка слов требует двух правок / steps

Ниже приведено движение слов

Запрос 1:

            Pos 1         Pos 2         Pos 3     Pos 4     Pos 5   Pos 6  Pos 7   Pos 8
--------------------------------------------------------------------------------------
Doc:        quick         brown         fox       jumps     over    the   lazy    dog
---------------------------------------------------------------------------------------
Query:                                  fox       quick     over
Slop 1:                                 fox|quick           over                                       
Slop 2:                   quick         fox                 over
Slop 3:    quick                        fox                 over

всего шагов 3

Запрос 2:

            Pos 1         Pos 2         Pos 3     Pos 4   Pos 5   Pos 6  Pos 7   Pos 8
--------------------------------------------------------------------------------------
Doc:        quick         brown         fox       jumps    over    the   lazy    dog
---------------------------------------------------------------------------------------
Query:                    over          fox       quick
Slop 1:                   over          fox|quick            
Slop 2:                   quick|over    fox           
Slop 3:     quick         over          fox       
Slop 4:     quick                       over|fox      
Slop 5:     quick                       fox       over
Slop 6:     quick                       fox               over

Всего шагов 6

1 голос
/ 29 марта 2020

Итак, я воспроизвел проблему с предоставленным вами отображением и смог устранить ее с помощью Explain API и этой статьи о slop в запросах match_phrase.

Таким образом, ваш второй запрос дает результат, когда задано минимальное значение slop of 6, как показано в результатах моего поиска.

Поисковый запрос

{
 "query": {
   "match_phrase": {
     "title": {
       "query": "over fox quick", "slop": 6 --> note 6
     }
   }
 } 
}

Аналогично, вам нужно дать minimum slop of 3, чтобы получить результат поиска по вашему первому запросу.

В основном наклонное значение означает допустимое отклонение настраиваемого термина.

Пример: - ваш do c содержит Quick Brown fox jumps over the lazy dog.

Quick
Brown
fox
jumps
over
the
lazy 
dog

И если вы ищете fox quick over как фразу, все они должны собраться вместе , для этого вам нужно переставить упомянутые токены выше.

Требуется минимальная замена 3, как показано ниже:

fox и over не нужно ничего менять, так как они уже в порядке и quick нужно сделать 3 замены, чтобы прийти к ее исправлению t position.

Используя тот же метод, вы можете выяснить, почему для работы второго запроса требуется шесть помет.

...