# Поиск по массиву string

**URL:** https://discuss.elastic.co/t/string/118159
**Category:** Вопросы на русском языке
**Created:** [February 2, 2018, 6:30am UTC](https://discuss.elastic.co/t/string/118159 "2018-02-02T06:30:16Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![IvanTushin](https://avatars.discourse-cdn.com/v4/letter/i/dbc845/32.png) [@IvanTushin](https://discuss.elastic.co/u/IvanTushin)
#### Post date: [February 2, 2018, 6:30am UTC](https://discuss.elastic.co/t/string/118159/1 "2018-02-02T06:30:16Z")

</div>

Добрый день! Мне нужно сделать поиск по фразе, причем поиск должен происходить по нескольким строкам с анализатором. Можно как-нибудь реализовать разделение строк, что бы поиск был как по nested объектам, но таковым не являлся?

---

<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 2, 2018, 3:11pm UTC](https://discuss.elastic.co/t/string/118159/2 "2018-02-02T15:11:47Z")

</div>

Вы не могли бы привести пример записей и запросов, которые должны и не должны возвращать эти записи?

---

<div class="post-metadata">

### Author: ![IvanTushin](https://avatars.discourse-cdn.com/v4/letter/i/dbc845/32.png) [@IvanTushin](https://discuss.elastic.co/u/IvanTushin)
#### Post date: [February 2, 2018, 5:24pm UTC](https://discuss.elastic.co/t/string/118159/3 "2018-02-02T17:24:55Z")

</div>

Например, у меня есть 2 строки в одном документе: "синий квадрат" и "желтый треугольник". Я произвожу поиск в окрестности 10 слов. Судя по [документации](https://www.elastic.co/guide/en/elasticsearch/reference/6.0/nested.html), все массивы становятся плоскими списками, поэтому я могу найти строку "синий треугольник", хотя слова синий и треугольник относятся к разным строкам. Вот такого поведения хочу избежать. Использовать nested не хотел, т.к. строки короткие и их достаточно много (примерно 100 на документ), боюсь за производительность.

---

<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 2, 2018, 6:36pm UTC](https://discuss.elastic.co/t/string/118159/4 "2018-02-02T18:36:52Z")

</div>

А как у вас запрос выглядит? Вы `match_phrase` используете?

---

<div class="post-metadata">

### Author: ![IvanTushin](https://avatars.discourse-cdn.com/v4/letter/i/dbc845/32.png) [@IvanTushin](https://discuss.elastic.co/u/IvanTushin)
#### Post date: [February 3, 2018, 3:06pm UTC](https://discuss.elastic.co/t/string/118159/5 "2018-02-03T15:06:58Z")

</div>

Похоже, я не правильно понял документацию. Все таки эластик различает элементы массива.  
Я создал документ

```
{
"attr": ["синий квадрат", "желтый треугольник"]
}

```

и использовал поисковый запрос

```
{
"query": {
    "span_near" : {
        "clauses" : [
            { "span_term" : { "attr" : "синий" } },
            { "span_term" : { "attr" : "треугольник" } }
        ],
        "slop" : 12,
        "in_order" : false
    }
}

```

}

который не вернул исходного документа.

Раньше я считал, что такой документ будет проиндексирован как склеенная строка "синий квадрат желтый треугольник" и поиск в окрестности будет происходить с ошибкой.

Извиняюсь за беспокойство, нужно было сначала самому проверить.

---

<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 5, 2018, 3:37pm UTC](https://discuss.elastic.co/t/string/118159/6 "2018-02-05T15:37:24Z")

</div>

> [@IvanTushin](#):
>
> Раньше я считал, что такой документ будет проиндексирован как склеенная строка "синий квадрат желтый треугольник"

Нет. Такой документ будет проиндексирован как `синий`, `квадрат`, ... 100 позиций пропущено ...`желтый`, `треугольник`

Другими словами ` "slop" : 120,` эту запись должен найти. Посмотрите [position\_increment\_gap | Elasticsearch Reference [6.1] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/6.1/position-increment-gap.html)

---

<div class="post-metadata">

### Author: ![IvanTushin](https://avatars.discourse-cdn.com/v4/letter/i/dbc845/32.png) [@IvanTushin](https://discuss.elastic.co/u/IvanTushin)
#### Post date: [February 6, 2018, 5:40am UTC](https://discuss.elastic.co/t/string/118159/7 "2018-02-06T05:40:18Z")

</div>

Спасибо! Т.е. если я знаю, что буду искать в пределах 10 слов, можно уменьшить значение position\_increment\_gap до 10?

---

<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 6, 2018, 2:00pm UTC](https://discuss.elastic.co/t/string/118159/8 "2018-02-06T14:00:38Z")

</div>

Да можно, но я не думаю, что это будет иметь какой-нибудь значительный эффект на производительность. Позиция - это просто число. 100 пропущенных позиций просто означает что `квадрат` будет иметь позицию 1 и `желтый` будет иметь позицию 101. Это вовсе не означает, что между этими токенами будет сохранено 100 пустышек или что-нибудь в этом роде. `slop` - это просто арифметическая операция над позициями.

---

<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 6, 2018, 2:00pm UTC](https://discuss.elastic.co/t/string/118159/9 "2018-03-06T14:00:50Z")

</div>

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