#elasticsearch
#elasticsearch
Вопрос:
Используя Tokenizer, нечеткость и Edge n-грамм, у меня есть три документа:
- «Star Trek I»
- «Star Trekian»
- «Звездный тракиан: документальный фильм «Звездный путь»»
Поиск «Star Trek» с нечеткостью дает «Star Trekian» более высокий балл, чем «Star Trek» из-за дополнительных токенов, которые соответствуют «Trek» (=> «Treki«). Является ли лучший способ борьбы с этим, чтобы дополнительно соответствовать с меньшей или нулевой нечеткостью?
Кроме того, «Star Trakian: документальный фильм о звездном пути» получает еще более высокий балл, потому что он соответствует «Trak» и «Trek«. Есть ли способ сопоставить только лучший токен или любой другой метод, чтобы оценить его так же, как «Star Trek I» (потому что оба содержат «Star Trek«)?
Редактировать:
Сопоставления и настройки:
PUT /stackoverflow
{
"settings": {
"number_of_shards": 1,
"analysis": {
"filter": {
"edge_n_gram": {
"type": "edge_ngram",
"min_gram": "1",
"max_gram": "50"
}
},
"analyzer": {
"autocomplete": {
"filter": [
"lowercase",
"asciifolding",
"edge_n_gram"
],
"type": "custom",
"tokenizer": "autocomplete"
},
"autocomplete_search": {
"filter": [
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "char_group"
},
"full_word": {
"filter": [
"lowercase",
"asciifolding"
],
"type": "custom",
"tokenizer": "char_group"
}
},
"tokenizer": {
"autocomplete": {
"type": "standard"
},
"char_group": {
"type": "char_group",
"tokenize_on_chars": [
"whitespace",
"-",
"."
]
}
}
}
},
"mappings": {
"properties": {
"search_field_full": {
"type": "text",
"similarity": "boolean",
"fields": {
"raw": {
"type": "text",
"similarity": "boolean",
"analyzer": "full_word",
"search_analyzer": "autocomplete_search"
}
},
"analyzer": "autocomplete",
"search_analyzer": "autocomplete_search"
}
}
}
}
Документы:
POST stackoverflow/_doc/
{
"search_field_full": "Star Trek I"
}
POST stackoverflow/_doc/
{
"search_field_full": "Star Trakian: A Star Trek Documentary"
}
POST stackoverflow/_doc/
{
"search_field_full": "Star Trekian"
}
Запрос:
GET stackoverflow/_search
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"fields": [
"search_field_full"
],
"fuzziness": "AUTO:4,7",
"max_expansions": 500,
"minimum_should_match": 2,
"operator": "or",
"query": "Star Trek",
"type": "best_fields"
}
}
],
"should": [
{
"multi_match": {
"fields": [
"search_field_full.raw^30"
],
"fuzziness": 0,
"operator": "or",
"query": "Star Trek",
"type": "best_fields"
}
},
{
"multi_match": {
"fields": [
"search_field_full.raw^20"
],
"fuzziness": 1,
"operator": "or",
"query": "Star Trek",
"type": "best_fields"
}
}
]
}
}
}
Комментарии:
1. не могли бы вы поделиться своим отображением, примерами документов и запросом, чтобы я мог легко воспроизвести вашу проблему
2. Спасибо за проявленный интерес. Я добавил их в свой пост.