Добрый день! Я создаю справочник организаций, и пытаюсь использовать триграммы для корректировки ошибок и функционала "может быть вы имели ввиду?".
Однако, я получаю не совсем релевантные ответы, а именно, выдается не самое приближенное название. Например, есть сокращенное написание организации и полное, а при поиске короткого, наиболее релевантным считается полное. Я перерыл весь интернет и не нашел только вот эту статью, но у меня почему-то не работает.
Помогите, пожалуйста, с настройкой релевантности?
Вот мой маппинг:
{
"mappings": {
"_doc": {
"dynamic": "strict",
"properties": {
"role": {
"type": "keyword"
},
"id": {
"type": "long"
},
"fnsId": {
"type": "long"
},
"data": {
"type": "text",
"analyzer": "russian",
"fields": {
"edge_ngram": {
"type": "text",
"analyzer": "russian_edge_ngram"
},
"ngram": {
"type": "text",
"analyzer": "russian_ngram"
}
}
},
"suggest": {
"type": "completion",
"analyzer": "russian"
},
"okved": {
"type": "keyword"
},
"region": {
"type": "integer"
},
"address": {
"type": "text",
"index": false
},
"postalAddress": {
"type": "text",
"index": false
},
"sortField": {
"type": "integer"
}
}
}
},
"settings": {
"number_of_shards": 4,
"number_of_replicas": 1,
"index.refresh_interval": "0",
"index.sort.field": "sortField",
"index.sort.order": "desc",
"analysis": {
"char_filter": {
"any_char_split": {
"pattern": "[^A-Za-z0-9а-яА-Я]",
"type": "pattern_replace",
"replacement": " "
},
"replace_e": {
"type": "mapping",
"mappings": [
"ё => е"
]
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3
}
},
"analyzer": {
"russian": {
"filter": [
"lowercase"
],
"char_filter": [
"replace_e",
"any_char_split"
],
"tokenizer": "standard"
},
"russian_ngram": {
"filter": [
"lowercase"
],
"char_filter": [
"replace_e",
"any_char_split"
],
"tokenizer": "ngram_tokenizer"
}
}
}
}
}
Вот запрос который я отправляю:
POST dictionary_organizations/_doc/_search
{
"query": {"match" : {
"data.ngram" : {
"query" : "рога и копыта"
}
}}
}
И вот ответ:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 4,
"successful": 4,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1.7406245,
"hits": [
{
"_index": "dictionary_organizations",
"_type": "_doc",
"_id": "s3",
"_score": 1.7406245,
"_source": {
"data": "общество с ограниченной ответственностью рога и копыта"
}
},
{
"_index": "dictionary_organizations",
"_type": "_doc",
"_id": "s1",
"_score": 1.7260926,
"_source": {
"data": "ооо рога и копыта"
}
},
{
"_index": "dictionary_organizations",
"_type": "_doc",
"_id": "s2",
"_score": 1.4384104,
"_source": {
"data": "ооо только рога"
}
}
]
}
}
Почему самым релевантным документом считается "общество с ограниченной ответственностью рога и копыта" а не "ооо рога и копыта"?