Итак, у вас есть 2 части вашего вопроса.
- Вы хотите найти заголовок, содержащий
police
, при поиске policeman
. - хотите узнать, почему
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.
}
}
]