Исправление опечаток для русского языка

Добрый день.

Есть поисковый индекс с настройками:

'settings' => [
                    'number_of_shards' => 1,
                    'number_of_replicas' => 0,
                    'analysis'=>[
                        'char_filter'=>[
                            'ru'=>[
                                'type'=>'mapping',
                                'mappings'=>'Ё=>Е, ё=>е'
                            ],
                            'html_strip'=>[
                                'type'=>'html_strip'
                            ]
                        ],
                        'filter'=>[
                            'ru_RU'=>[
                                'type'=>'hunspell',
                                'language'=>'ru_RU',
                                'dedup'=>true
                            ],
                            'stopwords_ru'=>[
                                'type'=>'stop',
                                'stopwords'=>['а','без','более','бы','был','была','были','было','быть','в','вам','вас',
                                    'весь','во','вот','все','всего','всех','вы','где','да','даже','для','до','его','ее',
                                    'если','есть','еще','же','за','здесь','и','из','или','им','их','к','как','ко','когда',
                                    'кто','ли','либо','мне','может','мы','на','надо','наш','не','него','нее','нет','ни',
                                    'них','но','ну','о','об','однако','он','она','они','оно','от','очень','по','под',
                                    'при','с','со','так','также','такой','там','те','тем','то','того','тоже','той',
                                    'только','том','ты','у','уже','хотя','чего','чей','чем','что','чтобы','чье','чья',
                                    'эта','эти','это','я'
                                ],
                                'ignore_case'=>true
                            ],
                            'custom_word_delimiter'=>[
                                'type'=>'word_delimiter',
                                'generate_word_parts'=>true,
                                'generate_number_parts'=>true,
                                'catenate_words'=>true,
                                'catenate_numbers'=>false,
                                'catenate_all'=>true,
                                'split_on_case_change'=>true,
                                'preserve_original'=>true,
                                'split_on_numerics'=>false
                            ],
                            'shingle'=>[
                                'type'=>'shingle',
                                'min_shingle_size'=>2,
                                'max_shingle_size'=>3
                            ]
                        ],
                        'analyzer' => [
                            'ru_RU' => [
                                'tokenizer'=>'standard',
                                'filter'=>['lowercase', 'stop', 'stopwords_ru', 'custom_word_delimiter', 'ru_RU'],
                                //'filter'=>['lowercase', 'ru_RU'],
                                'char_filter'=>['ru', 'html_strip']
                            ],
                            'phrase'=>[
                                'type'=>'custom',
                                'tokenizer'=>'standard',
                                'filter'=>['lowercase', 'shingle']
                            ]
                        ]
                    ]
                ],
                'mappings' => [
                    '_source'=>[
                        'enabled'=>true
                    ],
                    'properties' => [
                        'title' => [
                            'type' => 'text',
                            'analyzer' => 'ru_RU',
                        ],
                        'key' => [
                            'type' => 'text',
                            'analyzer' => 'phrase',
                        ],
                        'body' => [
                            'type' => 'text',
                            'analyzer' => 'ru_RU',
                        ],
                        'tags' => [
                            'type' => 'text'
                        ]
                    ]
                ]

Пытаюсь реализовать исправление опечаток через phrase suggest

'suggest'=>[
                    'text'=>'компутер',
                    'my_suggest'=>[
                        'phrase'=>[
                            'size'=>1,
                            'field'=>'key',
                            'suggest_mode'=>'always',
                            'direct_generator'=>[
                                [
                                    'field'=>'key',
                                    'suggest_mode'=>'always',
                                    //'min_word_len'=>3,
                                    //'min_doc_freq'=>5
                                ]
                            ],
                            'max_errors'=>4,
                            'real_word_error_likelihood'=> 0.95,
                            'gram_size'=>2,
                            'collate'=>[
                                'query'=>[
                                    'inline'=>[
                                        'match'=>[
                                            '{{field_name}}'=>[
                                                'query'=>'{{suggestion}}',
                                                'operator'=>'and'
                                            ]
                                        ]
                                    ]
                                ],
                                'params'=>[
                                    'field_name'=>'key'
                                ]
                            ],
                            'highlight'=>[
                                'pre_tag'=>'<b>',
                                'post_tag'=>'</b>'
                            ]
                        ]
                    ],
                ]

Проблема вот в чем: ввожу компутер, исправлений нет, но в индексе есть слово компьютеров, если вводу ошибочное слово компутеров, то исправление выдает.

Как можно реализовать возможность выдачи подсказки для слова компутер, компутерам и т.д., т.е. обработку всех форм слова?
Спасибо.

Теоретически, можно было бы пропустить все через анализатор (suggester по умолчанию использует simple анализатор, который можно заменить на ru_RU, например), и тогда для компутер работать будет, но, наоборот, если в индексе есть компьютер и пользователь вводит компутеров, то в лучшем случае, вы получите назад компьютер, а не компьютеров.

Спасибо за помощь, да все так и есть, если применяю анализатор ru_RU, то выдает компьютер, если не применяю, то компьютеров выдает, хотелось бы все формы слова, пока идей нет, буду думать.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.