Здравствуйте, нужна помощь в корректировке настроек поиска. Вкратце опишу проблему.
Когда мы забиваем в поиск слово например "Приора" то помимо реальных документов где встречается слово приора вылетают такие документы где встречается слова типа "привода", "приготовления", "пример" и тд.
Сейчас настроен edge_ngran таким образом, что режет слово на куски в диапазное от 3 - 4 вхождений, например - "при", "прио", "приор" и вот где встречается один из кусков, возвращаются результаты.
Мне кажется надо задать в параметрах количество вхождений кусков слова хотябы 2 или 3. То есть если в слове есть "при", "прио" и "приор" то слово проходит, иначе отсеивается. Таким образом отсеются всякие "прицепы" "примеры" и др.
Но я пока не разобрался как это сделать. Возможно я ошибаюсь и решается это иначе, короче говоря нужна помощь, если кто вкурсе как это делается, помогите пожалуйста буду очень благодарен
Я использую php клиент для работы с elasticsearch
Конфиг:
$this->client->indices()->create([
'index' => 'posts',
'body' => [
'mappings' => [
'properties' => [
'id' => [
'type' => 'integer',
],
'published_at' => [
'type' => 'date',
],
'name' => [
'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,
'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',
],
],
],
],
],
],
]);
Запрос:
$this->client->search([
'index' => 'posts',
'body' => [
'bool' => [
'match' => [
[
'multi_match' => [
'query' => $value
'fields' => ['name'],
'operator' => 'and',
],
]
],
],
'size' => 1000,
'highlight' => [
'fields' => [
'name' => new \stdClass()
],
'number_of_fragments' => 0
]
]
])