Регулярный запрос Titan ES по токенизированному полю?
-
21-12-2019 - |
Вопрос
Я использую Titan 0.4.0 и пытаюсь использовать последнюю версию. REGEX
оператор для поиска строки ES.
Я создал индекс на my_key
для моего индекса ES с именем search
.
gremlin> g.makeKey("my_key").dataType(String.class).indexed("search",Vertex.class).single().make()
==>v[82]
Затем я добавляю вершину:
gremlin> v = g.addVertex(null, ["my_key":"123-abc"])
==>v[8]
gremlin> v.map
==>{my_key=123-abc}
А REGEX
вроде работает...
gremlin> g.query().has("my_key", REGEX, "[12]{2}3").vertices()
==>v[8]
...но только на моем токенизированном "123"
и "abc"
независимо:
gremlin> g.query().has("my_key", REGEX, "123").vertices()
==>v[8]
gremlin> g.query().has("my_key", REGEX, "abc").vertices()
==>v[8]
Однако, если я попытаюсь запустить регулярное выражение, соответствующее моему полному значению, моя вершина не будет получена (ни один из приведенных ниже результатов не возвращает):
gremlin> g.query().has("my_key", REGEX, "123-abc").vertices()
gremlin> g.query().has("my_key", REGEX, "123.abc").vertices()
gremlin> g.query().has("my_key", REGEX, "[0-9]+.[abc]{3}").vertices()
gremlin> g.query().has("my_key", REGEX, "123.").vertices()
Есть ли в Titan способ запросить индекс таким образом (регулярное выражение без токенизированных/проанализированных терминов)?
Решение
То, как это обрабатывалось в Titan вплоть до версии 0.4.0, может немного сбивать с толку, поскольку строки всегда маркируются, когда они индексируются во внешнем механизме индексации.Это приводит к тому, что строки «разбиваются» на слова, а небуквенные символы (а также стоп-слова) игнорируются.
В предстоящем выпуске Titan 0.4.1 мы сделаем это более явным.Взгляните на обновленную документацию:https://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search
Суть:Теперь вы можете указать, хотите ли вы, чтобы ваши строки индексировались «как есть» или как набор слов после анализа.Для вашего варианта использования это будет первое.Также мы уточнили терминологию:Если вы ищете слова в строке, соответствующие регулярному выражению, используется предикат Text.CONTAINS_REGEX.Если вы хотите, чтобы вся строка соответствовала выражению, используйте Text.REGEX.
Titan 0.4.1 в настоящее время находится на стадии финальной предварительной версии и будет выпущен на следующей неделе.