День добрый!
Делаю обычный полнотекстовый поиск по блогу, товарам и тд с использованием elasticsearch
Пример: Ищу слово "двухкамерная"
Проблема в том что при использовании метода
query_string ищется по совпадению меньше слова без окончания, то есть
двух, двухкам, двухкамерн - находит
двухкамерная двухкамерные - уже не находит
Второй вариант при использовании
multi_match все наоборот - все до слова без окончания не ищется
двух, двухкам, двухкаме - не находит
двухкамерная двухкамерные - находит
Пробовал включить н граммы и разные вариации настройки индекса. Ниже оставлю настройки!
Как сделать чтобы искал и по части слова и по слову с окончанием и по слову с ошибками ?
Пример запроса:
'query_string' => [
"fields" => ["title", "content"],
"query" => "*двухкамер*",
"fuzziness" => "AUTO",
]
Настройки индекса:
'settings' => [
'number_of_shards' => 1,
'number_of_replicas' => 0,
'analysis' => [
'filter' => [
"shingle" => [
"type" => "shingle",
],
"ru_stop" => [
"type" => "stop",
"stopwords" => "_russian_"
],
"ru_stemmer" => [
"type" => "stemmer",
"language" => "russian"
],
"en_stemmer" => [
"type" => "stemmer",
"language" => "english"
],
"my_n_gram" => [
"type" => "edge_ngram",
"min_gram" => 3,
"max_gram" => 30,
]
],
'char_filter' => [
'pre_negs' => [
'type' => 'pattern_replace',
'pattern' => '(\\w+)\\s+((?i:never|no|nothing|nowhere|noone|none|not|havent|hasnt|hadnt|cant|couldnt|shouldnt|wont|wouldnt|dont|doesnt|didnt|isnt|arent|aint))\\b',
'replacement' => '~$1 $2'
],
'post_negs' => [
'type' => 'pattern_replace',
'pattern' => '\\b((?i:never|no|nothing|nowhere|noone|none|not|havent|hasnt|hadnt|cant|couldnt|shouldnt|wont|wouldnt|dont|doesnt|didnt|isnt|arent|aint))\\s+(\\w+)',
'replacement' => '$1 ~$2'
]
],
'analyzer' => [
'default' => [
'char_filter' => ["html_strip", "pre_negs", "post_negs"],
'type' => 'custom',
'tokenizer' => 'standard',
'filter' => ['lowercase', 'trim', 'ru_stemmer', 'en_stemmer', 'ru_stop', 'my_n_gram']
]
]
]
],