# Неточный поиск

**URL:** https://discuss.elastic.co/t/topic/164274
**Category:** Вопросы на русском языке
**Created:** [January 15, 2019, 9:20am UTC](https://discuss.elastic.co/t/topic/164274 "2019-01-15T09:20:39Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![Darkness](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/darkness/32/46962_2.png) [@Darkness](https://discuss.elastic.co/u/Darkness)
#### Post date: [January 15, 2019, 9:20am UTC](https://discuss.elastic.co/t/topic/164274/1 "2019-01-15T09:20:40Z")

</div>

Это возможно в elastic? Мне нужно найти записи с их процентом сходства и минимальным процентом (например, 30%) сходства?

Например, у нас есть входная строка «Hello» и в бд «Hello, world!», «Hello, friends!». В этом случае процент сходства составляет 77,4% и 61,53% соответственно. (через **similar\_text** php вычисляется )

Могу ли я получить записи с их сходством не вычисляя это через пхп, так как если это будет поиск среди тысяч записей будет беда. И установить минимальный процент схожести для поиска?  
я использую laravel 5 + драйвер (babenkoivan/scout-elasticsearch-driver)  
properties' =\> ['text' =\> ['type' =\> 'text', 'fields' =\> [ 'raw' =\> [ 'type' =\> 'keyword',] ] ],  
**upd**  
мне удалось добиться более подходящего результата  
'must'=\>[  
'match'=\>[  
'text'=\>[  
"fuzziness"=\>'AUTO',  
'query'=\>$query,  
]  
],  
],  
но как указать минимальный процент схожести?

---

<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: [January 15, 2019, 4:00pm UTC](https://discuss.elastic.co/t/topic/164274/2 "2019-01-15T16:00:50Z")

</div>

> [@Darkness](#):
>
> Это возможно в elastic?

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

---

<div class="post-metadata">

### Author: ![Darkness](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/darkness/32/46962_2.png) [@Darkness](https://discuss.elastic.co/u/Darkness)
#### Post date: [January 16, 2019, 8:12am UTC](https://discuss.elastic.co/t/topic/164274/3 "2019-01-16T08:12:40Z")

</div>

Да конечно.  
У меня есть таблица "works" в ней имя типа работы и цена. Записей будет миллионы.  
И будет приходить какой то прайс лист с работами. Нужно пройтись по нему и для каждой работы найти максимально похожее значение из типа работы в бд. Например есть в бд "установка розетки 1шт.", а в прайс листе "установить розетку бла бла бла ...". Соответственно нужно найти эту запись и узнать насколько процентов они схожи и задать минимальный процент. Но нужно еще учесть что эти две записи сейчас примерно на 60% но если строка "установить розетку бла бла бла ..." увеличиться в N раз и не на слова "установить розетку" то процент будет другой, но она то подходит и в итоге из за того что много других слов может попросту отпасть.

---

<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: [January 16, 2019, 10:20pm UTC](https://discuss.elastic.co/t/topic/164274/4 "2019-01-16T22:20:31Z")

</div>

Ну это похоже не нормальный поиск, вот только алгоритм совпадения не очень понятен. Может лучше считать совпадения по словам (возможно с некоторым количеством ошибок) а не по буквам - так будет гораздо быстрее. Другими словами, вам нужен поиск, который возвращал-бы самые похожие документы или вам нужен поиск, который рассчитывал-бы совпадения по вашему алгоритму?

---

<div class="post-metadata">

### Author: ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)
#### Post date: [January 17, 2019, 8:59am UTC](https://discuss.elastic.co/t/topic/164274/5 "2019-01-17T08:59:10Z")

</div>

Делал такое с фонетическим фильтром BMPM и min\_should\_match. Первый даёт совпадения различных форм слова, второй позволяет отрезать слабые совпадения по словам.  
Ещё есть More Like This (MLT) он работает когда нужно искать документ по документу. И да. Точно как в ПХП не будет.

---

<div class="post-metadata">

### Author: ![Darkness](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/darkness/32/46962_2.png) [@Darkness](https://discuss.elastic.co/u/Darkness)
#### Post date: [January 17, 2019, 9:12am UTC](https://discuss.elastic.co/t/topic/164274/6 "2019-01-17T09:12:47Z")

</div>

Да, по словам наверное будет сделать поиск лучше чем по символам. Тогда например той же розетке "установка розетки 1шт. " и то что ищем "установить розетку бла бла бла ..." будет совпадения двух слов будет ~77%

---

<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: [January 18, 2019, 7:49pm UTC](https://discuss.elastic.co/t/topic/164274/7 "2019-01-18T19:49:28Z")

</div>

Тогда я бы начал с чего-нибудь простого вроде:

```auto
DELETE test
PUT test
{
  "settings": {
    "analysis": {
      "filter": {
        "russian_stemmer": {
          "type": "stemmer",
          "language": "russian"
        }
      },
      "analyzer": {
        "russian": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "russian_stemmer"
          ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "text": {
          "type": "text",
          "analyzer": "russian"
        }
      }
    }
  }
}

PUT test/_doc/1
{
  "text": "установка розетки 1шт."
}

PUT test/_doc/2
{
  "text": "установить розетку бла бла бла ..."
}

GET test/_search?search_type=dfs_query_then_fetch
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "text": "установка розетки 1шт."
          }
        },
        {
          "match": {
            "text": {
              "query": "установка розетки 1шт.",
              "fuzziness": 2,
              "boost": 0.5
            }
          }
        }
      ]
    }
  }
}

```

---

<div class="post-metadata">

### Author: ![Darkness](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/darkness/32/46962_2.png) [@Darkness](https://discuss.elastic.co/u/Darkness)
#### Post date: [February 1, 2019, 8:21am UTC](https://discuss.elastic.co/t/topic/164274/8 "2019-02-01T08:21:56Z")

</div>

Ну вроде ищет только я не пойму почему если строки одинаковые то выдает ее соответственно но если строка поиска "Розетка информационная" и в бд есть такие строки "Розетка информационная 45x22.5mm ", "Телефонная панель 50 портов ", "Розетка RJ-45, одинарная, категория 5е.", то первый результат "Розетка информационная 45x22.5mm " а второй почему то "Телефонная панель 50 портов" а не "Розетка RJ-45, одинарная, ...."

---

<div class="post-metadata">

### Author: ![leov](https://avatars.discourse-cdn.com/v4/letter/l/ed655f/32.png) [@leov](https://discuss.elastic.co/u/leov)
#### Post date: [February 1, 2019, 11:19am UTC](https://discuss.elastic.co/t/topic/164274/9 "2019-02-01T11:19:26Z")

</div>

прямо чудо какое-то!!! искусственный интеллект прямо  
просекает что там 50 портов а тут всего одинарная  
😀

---

<div class="post-metadata">

### Author: ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)
#### Post date: [February 1, 2019, 11:32am UTC](https://discuss.elastic.co/t/topic/164274/10 "2019-02-01T11:32:48Z")

</div>

explainAPI ?

---

<div class="post-metadata">

### Author: ![Darkness](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/darkness/32/46962_2.png) [@Darkness](https://discuss.elastic.co/u/Darkness)
#### Post date: [February 12, 2019, 9:37am UTC](https://discuss.elastic.co/t/topic/164274/11 "2019-02-12T09:37:04Z")

</div>

вы не правильно поняли в искомом слове есть "Розетка " и в исходном но почему то алгоритм посчитал что не важно что оно есть там и там выбрал другой вариант менее похожий "Телефонная панель 50 портов" никак не более подходящий вариант к "Розетка информационная" хотя есть вариант с одинаковым вообще словом "Розетка RJ-45, одинарная, категория 5е."

---

<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: [February 12, 2019, 1:58pm UTC](https://discuss.elastic.co/t/topic/164274/12 "2019-02-12T13:58:40Z")

</div>

Надо смотреть что explain выдает. Возможно, что какой-то термин редкий - и он получает приоритет.

---

<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: [March 12, 2019, 1:58pm UTC](https://discuss.elastic.co/t/topic/164274/13 "2019-03-12T13:58:42Z")

</div>

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