Я строю корпоративную социальную сеть.
Я хочу предложить людям добавить в друзья в зависимости от их названия.
Например, значение может быть: разработчик, блогер, певец, парикмахер, бармен ...
Мои пользователи сохраняются в ElasticSearch, их заголовки сохраняются в поле 'title'.
Текущее отображение:
title: {
type: 'text',
analyzer: 'autocomplete_analyzer',
search_analyzer: 'autocomplete_analyzer_search'
}
и запрос:
should: [
{
match: {
title: {
query: user.title,
minimum_should_match: '90%',
boost: 2
}
}
}
]
и определения анализаторов:
indexConfig: {
settings: {
analysis: {
analyzer: {
autocomplete_analyzer: {
tokenizer: 'autocomplete_tokenizer',
filter: ['lowercase', 'asciifolding']
},
autocomplete_analyzer_search: {
tokenizer: 'lowercase',
filter: ['asciifolding']
},
phrase_analyzer: {
tokenizer: 'standard',
filter: ['lowercase', 'asciifolding', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
},
derivative_analyzer: {
tokenizer: 'standard',
filter: ['lowercase', 'asciifolding', 'derivative_filter', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
}
},
tokenizer: {
autocomplete_tokenizer: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 20,
token_chars: ['letter', 'digit']
}
},
filter: {
derivative_filter: {
type: 'word_delimiter',
generate_word_parts: true,
catenate_words: true,
catenate_numbers: true,
catenate_all: true,
split_on_case_change: true,
preserve_original: true,
split_on_numerics: true,
stem_english_possessive: true
},
en_stop: {
type: 'stop',
stopwords: '_english_'
},
en_stemmer: {
type: 'stemmer',
language: 'light_english'
},
fr_stop: {
type: 'stop',
stopwords: '_french_'
},
fr_stemmer: {
type: 'stemmer',
language: 'light_french'
}
}
}
}
}
Я проверил, релевантность очень хорошая, но им не хватает пользователей, соответствующих этому, из-за критериев '90%' .
Быстрое и грязное решение - понизить этот критерий до 50%.
Однако, если я это сделаю, я предполагаю, что Elastic будет искать заголовки на основе соответствия букв в названии, а не на соответствие близости между заголовками.
Например, если мой пользователь « парикмахер », ElasticSearch может предложить « бармен », потому что у них есть общее: b, a, r, e , г
Следовательно, у меня есть два вопроса:
1 - верно ли мое предположение?
2 - что я могу сделать, чтобы повысить релевантность при поиске по названию?