Как индексировать сложные логические выражения?

#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' (а также для гораздо более сложных операторов). Другими словами, вам нужно, чтобы ваши индексированные поисковые выражения и предоставленные пользователем поисковые запросы были в каком-то стандартизированном каноническом представлении логического выражения.