Tinkerpop API не использует смешанный индекс elasticsearch при извлечении данных из титана.

Tinkerpop API не использует смешанный индекс elasticsearch при извлечении данных из titan. Хотя, если мы напрямую используем титановый API, он использует смешанный индекс elasticsearch.

например Я создал смешанный индекс по имени.

Когда мы используем tinkerpop API: graph.iterator().V().has("name", "Apple"), он не использует смешанный индекс для «имени» и выдает журнал предупреждений «Запрос требует итерации по всем вершинам».

С титановым API он отлично работает и использует смешанный индекс для «имени», как указано ниже.

titanGraph.query().has("name", "Apple").vertices()

Что может быть причиной этого?


person amit mittal    schedule 07.03.2016    source источник
comment
Можете ли вы опубликовать код, в котором вы создали смешанный индекс? Вы создали свойство вершины name и смешанный индекс в одной и той же транзакции управления схемой?   -  person Jason Plurad    schedule 07.03.2016
comment
Вы пробовали graph.traversal().V().has("name", "Apple")?   -  person Mohamed Taher Alrefaie    schedule 07.03.2016


Ответы (2)


Это сообщение было опубликовано в списке рассылки TinkerPop

Во-первых, если вы делаете точные совпадения строк, это выглядит как составной индекс подойдет.

Вам следует просмотреть документацию по Titan в главе 20. Индекс Параметры и полнотекстовый поиск. Когда вы addKey(name) не указываете параметр сопоставления, смешанный индекс для ключа String по умолчанию будет использовать полнотекстовый поиск -- addKey(name, Mapping.TEXT.asParameter()). В документации перечислено множество подводных камней, которые следует учитывать при полнотекстовом поиске:

  • строка разбивается на набор слов, что позволяет пользователю эффективно запрашивать все совпадения, содержащие одно или несколько слов.
  • Токенизация Titan по умолчанию разбивает строку на символы, отличные от буквенно-цифровых, и удаляет все токены, содержащие менее 2 символов.
  • только предикаты полнотекстового поиска поддерживаются в графовых запросах серверной частью индексирования. [textContains, textContainsPrefix, textContainsRegex]
  • Полнотекстовый поиск нечувствителен к регистру.

Ваш запрос пытается выполнить сравнение на равенство, поэтому, возможно, более подходящим будет Mapping.STRING или Mapping.TEXTSTRING.

Я создал пару списков, чтобы сравнить разные версии. Вы можете вырезать и вставить эти примеры в консоль Gremlin.

Титан 0.5.4 https://gist.github.com/pluradj/ff1e1b1bcea0753adbb1

Титан 1.0.0 https://gist.github.com/pluradj/9bf96f8eae9fa24f3d61

Обратите внимание, что это поведение не изменилось между Titan 0.5.4 и 1.0.0, поэтому я не уверен, почему ваш пример работал раньше.

person Jason Plurad    schedule 07.03.2016
comment
Использование Mapping.STRING делает свойство непроанализированным в эластичном поиске, и мы теряем нечувствительность к регистру в эластичном поиске свойства. Прежде чем пометить свойство с помощью Mapping.STRING, это позволило нам выполнять поиск без учета регистра напрямую, по крайней мере, в кластере elasticsearch. Кстати, как сделать поиск в графе с помощью API tinkerpop по свойству с Mapping.TEXT. Любой пример поможет. - person amit mittal; 08.03.2016
comment
Вы не упомянули нечувствительность к регистру как требование в своем первоначальном вопросе. Тогда использование Mapping.TEXT с предикатом .has('name', textContains('apple')) должно работать. Пожалуйста, обратитесь к сути Titan 1.0.0, на которую я ссылался ранее. В нем есть примеры всех текстовых предикатов. - person Jason Plurad; 08.03.2016

Есть проблема со смешанными индексами ES. Существует задержка обновления/создания данных в ES. Таким образом, если запись создается, а затем сразу запрашивается с помощью ключа смешанного индекса, мы не получаем ее обратно. См. Titan 1.0[Berkeley+ES] - отложенное обновление индекса ES< /а>

person Akshaya    schedule 18.04.2016