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


#1

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


(Igor Motov) #2

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


#3

Например, у меня есть 2 строки в одном документе: "синий квадрат" и "желтый треугольник". Я произвожу поиск в окрестности 10 слов. Судя по документации, все массивы становятся плоскими списками, поэтому я могу найти строку "синий треугольник", хотя слова синий и треугольник относятся к разным строкам. Вот такого поведения хочу избежать. Использовать nested не хотел, т.к. строки короткие и их достаточно много (примерно 100 на документ), боюсь за производительность.


(Igor Motov) #4

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


#5

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

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

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

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

}

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

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

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


(Igor Motov) #6

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

Другими словами "slop" : 120, эту запись должен найти. Посмотрите https://www.elastic.co/guide/en/elasticsearch/reference/6.1/position-increment-gap.html


#7

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


(Igor Motov) #8

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


(system) #9

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