# Multi\_match bool\_prefix с фонетическим анализатором не работает как ожидается

**URL:** <https://discuss.elastic.co/t/multi-match-bool-prefix/244731>\
**Category:** Вопросы на русском языке\
**Created:** [August 12, 2020, 1:53pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731 "2020-08-12T13:53:40Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![111375](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/111375/32/73751_2.png) [@111375](https://discuss.elastic.co/u/111375)\
**Post date:** [August 12, 2020, 1:53pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/1 "2020-08-12T13:53:40Z")

</div>

Здравствуйте.  
У меня есть конфигурация индекса:

```auto
        {
    	"settings": {
    		"analysis": {
    			"filter": {
    				"translit_english": {
    					"type": "phonetic",
    					"encoder": "beider_morse",
    					"rule_type": "approx",
    					"name_type": "generic",
    					"languageset": [
    						"english"
    					]
    				},
    				"translit_cyrillic": {
    					"type": "phonetic",
    					"encoder": "beider_morse",
    					"rule_type": "approx",
    					"name_type": "generic",
    					"languageset": [
    						"cyrillic"
    					]
    				}
    			},
    			"analyzer": {
    				"translit_analyzer": {
    					"tokenizer": "standard",
    					"filter": [
    						"lowercase",
    						"translit_english",
    						"translit_cyrillic"
    					]
    				}
    			}
    		}
    	},
    	"mappings": {
    		"properties": {
    			"my_field": {
    				"type": "search_as_you_type",
    				"analyzer": "translit_analyzer",
    				"max_shingle_size": 3
    			}
    		}
    	}
    }

```

И есть несколько документов:

```auto
    {
    	"my_field": "напиток Coca-Cola"
    }
и
    {
    	"my_field": "напиток Burn"
    }

и
    {
    	"my_field": "напиток Fanta"
    }

```

Когда я делаю поисковой запрос ниже, то ожидаемо получаю в ответе документ "напиток Coca-Cola", так как срабатывает префиксный поиск.

```auto
    {
    	"query": {
    		"multi_match": {
    			"fields": [
    				"my_field",
    				"my_field._2gram",
    				"my_field._3gram"
    			],
    			"operator": "and",
    			"query": "ко",
    			"type": "bool_prefix"
    		}
    	}
    }

```

Но при этом, когда я делаю такой же запрос, но с другой поисковой строкой ("бе"), ожидающей в ответе "напиток Burn" - ответа не получаю. Хотя тут также должен был сработать префиксный поиск.

```auto
    {
    	"query": {
    		"multi_match": {
    			"fields": [
    				"my_field",
    				"my_field._2gram",
    				"my_field._3gram"
    			],
    			"operator": "and",
    			"query": "бе",
    			"type": "bool_prefix"
    		}
    	}
    }

```

То же самое и для "напиток Fanta", поисковой запрос "фан" не выдает ничего, хотя по префиксу должно искать.

Анализатор из конфигурации индекса выдает валидные токены для "Burn" и "бе", "Coca" и "ко" соответственно.  
Версия ES: 7.7.1

Помогите разобраться, в чем дело.

**UPD**  
По query: "fan" - "напиток Fanta" тоже не ищется. То есть дело, видимо, не в фонетике. Не отрабатывает почему-то префиксный поиск?

---

<div class="post-metadata">

**Author:** ![111375](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/111375/32/73751_2.png) [@111375](https://discuss.elastic.co/u/111375)\
**Post date:** [August 13, 2020, 10:01am UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/2 "2020-08-13T10:01:35Z")

</div>

Видится, что проблема именно на стыке запроса и кастомного анализатора **translit\_analyzer**.  
Потому что если добавить аналогичное поле с **russian** анализатором и сделать аналогичный запрос - префиксный поиск работает как ожидается.

```auto
		"my_field_2": {
			"type": "search_as_you_type",
			"analyzer": "russian",
			"max_shingle_size": 3
		}

```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [August 13, 2020, 8:02pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/3 "2020-08-13T20:02:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![111375](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/111375/32/73751_2.png) [@111375](https://discuss.elastic.co/u/111375)\
**Post date:** [August 13, 2020, 8:52pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/4 "2020-08-13T20:52:08Z")

</div>

@Igor_Motov, спасибо за ответ.  
Подскажите, может есть какое-то альтернативное решение тут?  
Задача: осуществлять поиск с учетом транслитерации (то, чего я пытался добиться, добавив анализатор из первого поста), используя при этом 'as you type' поиск (то, для чего создан тип search\_as\_you\_type).  
Анализатор 'translit\_analyzer' для нашего юз-кейса показал приемлемые результаты, но хотелось бы еще разрешить ситуацию с 'as you type' поиском.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [August 13, 2020, 9:11pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/5 "2020-08-13T21:11:02Z")

</div>

Альтернативное решение - индексировать два раза: один раз для поиска as you type без фильтров типа russian, и второй раз - для поиска, с нужными фильтрами.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [September 10, 2020, 9:11pm UTC](https://discuss.elastic.co/t/multi-match-bool-prefix/244731/6 "2020-09-10T21:11:10Z")

</div>

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