Добрый день! Мне нужно сделать поиск по фразе, причем поиск должен происходить по нескольким строкам с анализатором. Можно как-нибудь реализовать разделение строк, что бы поиск был как по nested объектам, но таковым не являлся?
Вы не могли бы привести пример записей и запросов, которые должны и не должны возвращать эти записи?
Например, у меня есть 2 строки в одном документе: "синий квадрат" и "желтый треугольник". Я произвожу поиск в окрестности 10 слов. Судя по документации, все массивы становятся плоскими списками, поэтому я могу найти строку "синий треугольник", хотя слова синий и треугольник относятся к разным строкам. Вот такого поведения хочу избежать. Использовать nested не хотел, т.к. строки короткие и их достаточно много (примерно 100 на документ), боюсь за производительность.
А как у вас запрос выглядит? Вы match_phrase
используете?
Похоже, я не правильно понял документацию. Все таки эластик различает элементы массива.
Я создал документ
{
"attr": ["синий квадрат", "желтый треугольник"]
}
и использовал поисковый запрос
{
"query": {
"span_near" : {
"clauses" : [
{ "span_term" : { "attr" : "синий" } },
{ "span_term" : { "attr" : "треугольник" } }
],
"slop" : 12,
"in_order" : false
}
}
}
который не вернул исходного документа.
Раньше я считал, что такой документ будет проиндексирован как склеенная строка "синий квадрат желтый треугольник" и поиск в окрестности будет происходить с ошибкой.
Извиняюсь за беспокойство, нужно было сначала самому проверить.
Нет. Такой документ будет проиндексирован как синий
, квадрат
, ... 100 позиций пропущено ...желтый
, треугольник
Другими словами "slop" : 120,
эту запись должен найти. Посмотрите position_increment_gap | Elasticsearch Reference [6.1] | Elastic
Спасибо! Т.е. если я знаю, что буду искать в пределах 10 слов, можно уменьшить значение position_increment_gap до 10?
Да можно, но я не думаю, что это будет иметь какой-нибудь значительный эффект на производительность. Позиция - это просто число. 100 пропущенных позиций просто означает что квадрат
будет иметь позицию 1 и желтый
будет иметь позицию 101. Это вовсе не означает, что между этими токенами будет сохранено 100 пустышек или что-нибудь в этом роде. slop
- это просто арифметическая операция над позициями.
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.