#elasticsearch #search #indexing #lucene
#elasticsearch #Поиск #индексирование #lucene
Вопрос:
Я работаю над проектом, в котором пользователь должен иметь возможность определять логическое выражение в документе. Для поиска документов они должны предоставить набор свойств, используемых в выражениях, и получить соответствующие документы, в которых вычисляется логическое выражение true
.
Итак, нам нужно индексировать выражения, которые выглядят как [var][operator][value]
где [var]
и [value]
также могут быть составлены как [var][operator][value]
.
Давайте рассмотрим пример. Пользователь задает следующее логическое выражение:
(color=read AND size=small) OR (color=blue AND (size=medium OR size=large)
Нам нужно поместить его в поисковую систему, чтобы его можно было запрашивать. Затем в запросе, если передать параметры color = red
, и size = small
пользователь должен получить индексированный документ, поскольку вычисляется выражение true
. Однако, если передать color = blue
, а size = small
затем ничего не должно быть возвращено.
В настоящее время мы можем обрабатывать их в памяти, создавая двоичное дерево выражений для упрощения вычисления. Однако это очень медленно из-за большого количества документов, которые нам нужно обрабатывать в каждом запросе (извлекать все документы, анализировать выражения для построения деревьев, оценивать выражения).
Поэтому мы хотели бы делегировать эту работу поисковой системе, если это возможно.
Есть ли способ индексировать такие выражения в виде двоичных деревьев (или других форм, таких как польская нотация) в поисковой системе?
И как построить запрос, чтобы вычисление выражения происходило в поисковой системе?
Комментарии:
1. Я не уверен, что вы подразумеваете под » лучшим способом индексирования таких логических выражений «. Вы не индексируете выражения — вы индексируете документы. Ваши индексы должны определять поля, на которые вы будете ссылаться в своих выражениях:
color
, иsize
в вашем примере. Если я неправильно понял вопрос, не могли бы вы уточнить?2. Я знаю, как это обычно бывает, поэтому я спрашиваю здесь :). Мне нужно сделать наоборот — индексировать логические выражения и передавать атрибуты в запросе. В нашей платформе клиенты должны иметь возможность определять и сохранять сложные логические выражения в документах, а затем запрашивать их, предоставляя набор атрибутов, которые будут использоваться для оценки выражений. У нас могут быть сотни и тысячи таких документов, поэтому теперь без ES нам нужно загружать их в память, оценивать назначенные логические выражения и отфильтровывать неподходящие документы.
3. Хорошо — спасибо за разъяснение. Похоже, у вас есть предложения «[переменная] [оператор] [значение]» (в простейшем случае) — так что вам понадобятся хотя бы эти поля. Это больше соответствует тому, о чем вы спрашиваете?
4. Каждое условие в выражении состоит из «[переменной] [оператора] [значения]». Однако [переменная] и [значение] также могут быть представлены как «[переменная] [оператор] [значение]» (т.е.
(color=read AND size=small) OR (color=blue AND (size=medium OR size=large))
).5. Понятно — следовательно, «в простейшем случае». Как только вы захотите обрабатывать логические операторы и круглые скобки, я думаю, вы находитесь в области полного синтаксического анализа. Похоже, что это то, где вы находитесь — так, например, похоже, что вам нужно
size = 'medium' and color = 'red'
быть эквивалентнымcolor= 'red' and size = 'medium'
(а также для гораздо более сложных операторов). Другими словами, вам нужно, чтобы ваши индексированные поисковые выражения и предоставленные пользователем поисковые запросы были в каком-то стандартизированном каноническом представлении логического выражения.