Elasticsearch корректировка поиска
Нужна помощь в настройке поисковика elasticsearch. Проблема состоит в том что на данный момент ищет много лишнего. Например, если забить в поиск "приора" то получим как и сам приору так и кучу результатов типа "приготовления", "прицепы", "привода" и прочее нинужное. Я использую [php клиент][1] для работы с эластиком Сейчас в индексе используеются следующие параметры:
$this->client->indices()->create([
'index' => 'lots',
'body' => [
'mappings' => [
'properties' => [
'id' => [
'type' => 'integer',
],
'published_at' => [
'type' => 'date',
],
'name' => [
'type' => 'text',
],
'lot_info' => [
'type' => 'text',
],
],
],
'settings' => [
'analysis' => [
'char_filter' => [
'replace' => [
'type' => 'mapping',
'mappings' => [
'&=> and '
],
],
],
'filter' => [
'word_delimiter' => [
'type' => 'word_delimiter',
'split_on_numerics' => false,
'split_on_case_change' => true,
'generate_word_parts' => true,
'generate_number_parts' => true,
'catenate_all' => true,
// 'preserve_original' => true,
'catenate_numbers' => true,
],
'trigrams' => [
'type' => 'edge_ngram',
'min_gram' => 3,
'max_gram' => 4,
],
],
'analyzer' => [
'default' => [
'type' => 'custom',
'char_filter' => [
'html_strip',
'replace',
],
'tokenizer' => 'whitespace',
'filter' => [
'lowercase',
'word_delimiter',
'trigrams',
],
],
],
],
],
],
]);
Фильтр ngram режет слово по 3-4 буквы получается "при" "рио" "иор" "ора" и тд. Но при таком использование выдается полный бред после первый пары результатов, отсеять их не получается.
Для себя я представляю алгоритм такого плана, нарезать слово не просто по 3 буквы а учитывать нарезу сначала слова, например "приора", "приор", "прио", "при" и выставить приоритет от большего к меньшему. Это не обязательно должны быть так как я написал, просто это мысли. Если кто знает как сделать поиск более "умным" подскажите пожалуйста
Ответы (1 шт):
использовать нграммы как основной поиск плохая идея. Лучше какой нибудь match по ключевым словам. Либо попробуйте добавить к поиску по нграмам minimum_should_match = 90%, хотя это вряд ли сильно поможет.