Нет совпадений в документе, если строка поиска длиннее поля поиска - PullRequest
0 голосов
/ 25 марта 2020

У меня есть заголовок, который я ищу

Название есть и хранится в документе как «Дневники полиции: stefan zweig»

При поиске «Police» я получаю результат. Но когда я ищу полицейского, я не получаю результат.

Вот запрос:

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "fields": [
              "title",
              omitted because irrelevance...
            ],
            "query": "Policeman",
            "fuzziness": "1.5",
            "prefix_length": "2"
          }
        }
      ],
      "must": {
        omitted because irrelevance...
      }
    }
  },
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

, а вот отображение

{
    "books": {
        "mappings": {
            "book": {
                "_all": {
                    "analyzer": "nGram_analyzer", 
                    "search_analyzer": "whitespace_analyzer"
                },
                "properties": {
                    "title": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "keyword"
                            },
                            "sort": {
                                "type": "text",
                                "analyzer": "to order in another language, (creates a string with symbols)",
                                "fielddata": true
                            }
                        }
                    }
                }
            }
        }
    }
}

Следует отметить, что у меня есть документы с заголовком «некоторый заголовок», который получать хиты, если я ищу «чей-то титул».

Я не могу понять, почему не появляется книга полиции.

1 Ответ

0 голосов
/ 25 марта 2020

Итак, у вас есть 2 части вашего вопроса.

  1. Вы хотите найти заголовок, содержащий police, при поиске policeman.
  2. хотите узнать, почему some title документы соответствуют документу someone title и в соответствии с этим вы ожидаете, что первый также будет соответствовать.

Позвольте мне сначала объяснить вам почему второй запрос соответствует и почему первый не соответствует. и затем скажет вам, как заставить работать первый.

В вашем документе, содержащем some title, создаются токены ниже, и вы можете проверить это с помощью analyzer API .

POST /_analyze

{
    "text": "some title",
    "analyzer" : "standard" --> default analyzer for text field
}

Сгенерированные токены

{
    "tokens": [
        {
            "token": "some",
            "start_offset": 0,
            "end_offset": 4,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "title",
            "start_offset": 5,
            "end_offset": 10,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

Теперь при поиске someone title с помощью запроса на совпадение , который анализируется и используется тот же анализатор, который используется на index time в поле.

Таким образом, он создает 2 токена someone и title, и запрос на совпадение совпадает с токеном title, и по этой причине он появляется в результатах поиска. Вы также можете использовать Объясните API , чтобы проверить и увидеть, как оно соответствует он подробно.

Как вывести police заголовок при поиске policeman

Вам необходимо использовать фильтр токенов синонимов , как показано в следующем примере .

Индекс Def

{
    "settings": {
        "analysis": {
            "analyzer": {
                "synonyms": {
                    "filter": [
                        "lowercase",
                        "synonym_filter"
                    ],
                    "tokenizer": "standard"
                }
            },
            "filter": {
                "synonym_filter": {
                    "type": "synonym",
                    "synonyms" : ["policeman => police"] --> note this
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "": {
                "type": "text",
                "analyzer": "synonyms"
            }
        }
    }
}

Пример индекса do c

{
  "dialog" : "police"
}

Поисковый запрос, имеющий термин policeman

{
    "query": {
        "match" : {
            "dialog" : {
                "query" : "policeman"
            }
        }
    }
}

А результат поиска

 "hits": [
      {
        "_index": "so_syn",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "dialog": "police" --> note source has `police` only.
        }
      }
    ]
...