Как искать и по части слова и по полному и с ошибками в Elasticsearch?

День добрый!
Делаю обычный полнотекстовый поиск по блогу, товарам и тд с использованием 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']
                            ]
                        ]
                    ]
                ],
  • Вопрос задан
  • 699 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы