# Не четкий поиск по массиву значений

**URL:** https://discuss.elastic.co/t/topic/198577
**Category:** Вопросы на русском языке
**Created:** [September 8, 2019, 7:51pm UTC](https://discuss.elastic.co/t/topic/198577 "2019-09-08T19:51:47Z")
**Posts on this page:** 17
**Page:** 1

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 8, 2019, 7:51pm UTC](https://discuss.elastic.co/t/topic/198577/1 "2019-09-08T19:51:47Z")

</div>

Подскажите как оформить запрос что бы можно было сделать поиск по текстовому полю с использованием массива значений К примеру запросом

```auto
    curl -XPOST 'elk:9200/shopcategory/shopcategory/_search?pretty' -d '{
        "query": {
            "bool": {
                "must": [{            
                        "match_all": {}            
                }],
                "filter": {
            "match": {
              "name": "девочкам"
            }
                }
            }
        }
    }}'

мы можем отфильтровать все записи по фразе "девочкам" Массив можно передавать только в тип term

```

```
"term": {
 "name": ["девочкам","мальчикам"]

```

}

```auto

Но term подразумевает только четкие вхождения, а нам нужно осуществить "не четкий поиск", т.е. что бы нашлись девочки, девочка, мальчик, и т.д На данный момент я просто делю массив по пробелам и заключаю фразы в кавычки по длинному предложений и делаю поиск. Вопрос в том как правильно отправить эластику массив значений для не четкого поиска по всем записям?

mapping

```

```
  'properties' => [
                    'id' => ['type' => 'long', 'index' => 'not_analyzed'],
                    'parent_id' => ['type' => 'long', 'index' => 'not_analyzed'],

                    'name' => ['type' => 'string', "index"=>"analyzed", "analyzer"=>"en_rus","fielddata"=> true],
                ]`
```

---

<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: [September 9, 2019, 1:48pm UTC](https://discuss.elastic.co/t/topic/198577/2 "2019-09-09T13:48:13Z")

</div>

Для нечеткого поиска надо индексировать со стемером (например [`kstem`](https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-kstem-tokenfilter.html)), а для поиска надо применять какой-нибудь запрос поддерживающий анализ, например [`match`](https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-match-query.html#query-dsl-match-query). Чтобы искать по нескольким словам, можно эти слова добавить в один `match` или объединить несколько запросов match в один запрос `bool`.

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 9, 2019, 2:20pm UTC](https://discuss.elastic.co/t/topic/198577/3 "2019-09-09T14:20:19Z")

</div>

Для не четкого поиска я использую `match`  
'fuzziness' =\> 'auto',  
'prefix\_length' =\> 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: [September 9, 2019, 2:37pm UTC](https://discuss.elastic.co/t/topic/198577/4 "2019-09-09T14:37:46Z")

</div>

без лишних манипуляций не получиться

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 9, 2019, 4:42pm UTC](https://discuss.elastic.co/t/topic/198577/5 "2019-09-09T16:42:42Z")

</div>

Другой вопрос.  
Можно ли получить в ответе, статистику по совпадениям слова? Документы и сколько раз встретилось совпадение?  
Т.е если мы искали слово "женщинам мужчинам детям"  
то получаем ответ  
женщинам 1  
мужчинам 2  
детям 1  
?

---

<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: [September 9, 2019, 4:56pm UTC](https://discuss.elastic.co/t/topic/198577/6 "2019-09-09T16:56:02Z")

</div>

Что вы потом будете с этими ответами делать?

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 9, 2019, 5:11pm UTC](https://discuss.elastic.co/t/topic/198577/7 "2019-09-09T17:11:48Z")

</div>

Мне нужно посчитать вхождения и определить релевантность длинного фразы. А точнее ветки каталога категорий

---

<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: [September 9, 2019, 5:32pm UTC](https://discuss.elastic.co/t/topic/198577/8 "2019-09-09T17:32:13Z")

</div>

> [@Dima\_Sid](#):
>
> определить релевантность длинного фразы

Проблема в следующем - информация по частоте совпадений во время поиска имеется. Однако, после того, как релевантность записи во время поиска рассчитана, эта информация больше не доступна. Все что мы можем сохранить это `_score`. Поэтому единственный способ вытащить эту информацию наружу - это путем рассчета `_score` на ее основе. Для этого в elasticsearch [много средств](https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index-modules-similarity.html).

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 9, 2019, 9:49pm UTC](https://discuss.elastic.co/t/topic/198577/9 "2019-09-09T21:49:42Z")

</div>

Столкнулся с такой проблемой.  
В анализируемом контенте часто встречаются слова "уход" и все производные к этому слову, а также "ухо" в разных формах  
"Лекарства для глаз и ушей" и т.д, я использую не четкий поиск  
'fuzziness' =\> 'auto',  
'prefix\_length' =\> 3,

При поиске слова "уход", в результат попадают документы содержащие "ухо", "уши" , "ушить", "уход."  
Тоже самое и в обратном направлении когда ищем слово "ухо".  
Как можно задать исключение, для того что бы эластик считал что слово ухо, уход, ушить это разные слова ?

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 10, 2019, 12:40pm UTC](https://discuss.elastic.co/t/topic/198577/10 "2019-09-10T12:40:00Z")

</div>

Погряз я в эластике, чем глубже тем запутанней. В начале казалось все просто.  
Подскажите как заставить эластик считать "Женщинам" "Женская"  
совпадением без использования словаря синонимов?  
с разными настройками запроса  
"fuzziness": "auto",  
"prefix\_length" : 2  
не получается.

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 10, 2019, 1:35pm UTC](https://discuss.elastic.co/t/topic/198577/11 "2019-09-10T13:35:03Z")

</div>

Имеет запись  
name = Женская обувь  
id = 2029

Отправляю запрос

```auto
      "query": {
        "bool": {
          "must": [
            { "match": { 
    			"name": {
    				"query": "женщинам",
    				"fuzziness": "auto",
    				"prefix_length" : 2        
    			}
    		}
    	  },        
    	  { "terms": { "id" : ["2029"]}}
          ]
        }
      }

```

Ответ ПУСТО!  
Отправляю запрос

```auto
      "query": {
        "bool": {
          "must": [
            { "match": { 
    			"name": {
    				"query": "женская",
    				"fuzziness": "auto",
    				"prefix_length" : 2        
    			}
    		}
    	  },        
    	  { "terms": { "id" : ["2029"]}}
          ]
        }
      }

```

Ответ

```auto
"hits" : [
  {
    "_index" : "shopcategory",
    "_type" : "shopcategory",
    "_id" : "2029",
    "_score" : 6.8748565,
    "_source" : {
      "id" : 2029,
      "parent_id" : 1986,
      "name" : "Женская обувь"
    }
  }

```

Настройки индекса такие

```auto
      'settings' => [
                'index' => ['refresh_interval' => '1s'],
                'analysis' => [
                    'filter' => [
                        'stopwords_ru' => [
                            'type' => 'stop',
                            'stopwords' => ['для','Для','от','из','со','на','по','за','до','них','все','под','другое','другие','другой','другая','товары','группа',],
                            'ignore_case' => 'true',
                        ],
                        'my_synonym_filter' => [
                            'type' => 'synonym',
                            'synonyms' => [
                                'женщинам, женская',                                
                            ],
                            'ignore_case' => 'true',
                        ],
                        'russian_stop' => [
                            'type' => 'stop',
                            'stopwords' => '_russian_',
                        ],
                        'russian_keywords' => [
                            'type' => 'keyword_marker',
                            'keywords' => ["пример"],
                        ],
                        'russian_stemmer' => [
                            'type' => 'stemmer',
                            'language' => 'russian',
                            //'language' => 'russian_morphology',
                        ],
                        'english_stemmer' => [
                            'type' => 'stemmer',
                            'language' => 'english',
                        ],
                    ],
                    'analyzer' => [
                        'en_rus' => [
                            'type' => 'custom',
                            'tokenizer' => 'standard',
                            'filter' => [
                                'lowercase',
                                'russian_morphology',
                                'my_synonym_filter',
                                'russian_stemmer',
                                'english_stemmer',
                                'russian_stop',
                                'my_synonym_filter',
                                'stopwords_ru',
                            ]
                        ]
                    ]
                ],
            ],

```

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 10, 2019, 1:36pm UTC](https://discuss.elastic.co/t/topic/198577/12 "2019-09-10T13:36:14Z")

</div>

Почему эластик не показывает совпадение при запросе Женщинам и id 2029?

---

<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: [September 10, 2019, 1:48pm UTC](https://discuss.elastic.co/t/topic/198577/13 "2019-09-10T13:48:26Z")

</div>

Без mapping- а для поля `name` сказать сложно. А зачем вы два русских стеммера добавили?

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 10, 2019, 1:50pm UTC](https://discuss.elastic.co/t/topic/198577/14 "2019-09-10T13:50:31Z")

</div>

Проблема решилась, модуль russian\_morphology не корректно работает, отключили его.

---

<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: [September 10, 2019, 1:54pm UTC](https://discuss.elastic.co/t/topic/198577/15 "2019-09-10T13:54:35Z")

</div>

Два стеммера для одного и того же языка работать одновременно не могут.

---

<div class="post-metadata">

### Author: ![Dima\_Sid](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dima_sid/32/53790_2.png) [@Dima\_Sid](https://discuss.elastic.co/u/Dima_Sid)
#### Post date: [September 10, 2019, 1:55pm UTC](https://discuss.elastic.co/t/topic/198577/16 "2019-09-10T13:55:57Z")

</div>

да все верно но при одном russian\_morphology результаты теже. Вырубили и все заработало

---

<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: [October 8, 2019, 2:07pm UTC](https://discuss.elastic.co/t/topic/198577/17 "2019-10-08T14:07:07Z")

</div>

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