Регулярный запрос Titan ES по токенизированному полю?

StackOverflow https://stackoverflow.com//questions/20015977

  •  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 в настоящее время находится на стадии финальной предварительной версии и будет выпущен на следующей неделе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top