Стандартная индексация Titan против индексации эластичного поиска

Согласно Titan Wiki, стандартный индекс Titan может выполнять только запросы с точными совпадениями, а использование эластичного поиска позволит мне выполнять запросы с числовыми диапазонами и полнотекстовый поиск.

Однако, когда я выполняю следующее БЕЗ elasticsearch:

g=TitanFactory.open('e:/titan-cassandra.properties');
v=g.addVertex(null);
v.setProperty('mytext','i am the first vertex.');
v.setProperty('age',123);
v=g.addVertex(null);
v.setProperty('mytext','hello from a vertex.');
v.setProperty('age',456);
v=g.addVertex(null);
v.setProperty('mytext','hello world.');
v.setProperty('age',789);
System.out.println();
g.V.map;
System.out.println();
g.V.has('mytext',Text.REGEX,'.*vertex.*').map;
System.out.println();
g.V.has('mytext',Text.REGEX,'.*hello.*').map;
System.out.println();
g.V.has('age',Cmp.GREATER_THAN_EQUAL,200).has('age',Cmp.LESS_THAN_EQUAL,700).map;

Я могу получить правильные результаты следующим образом:

==>{mytext=i am the first vertex., age=123}
==>{mytext=hello from a vertex., age=456}
==>{mytext=hello world., age=789}

==>null
==>{mytext=hello from a vertex., age=456}
==>{mytext=i am the first vertex., age=123}

==>null
==>{mytext=hello world., age=789}
==>{mytext=hello from a vertex., age=456}

==>null
==>{mytext=hello from a vertex., age=456}

Я очень любопытный. Почему это происходит? Требуется ли эластичный поиск по-прежнему для выполнения поиска по регулярным выражениям или поиска по числовому диапазону?

Спасибо.


person Melvin Yam    schedule 13.06.2014    source источник


Ответы (1)


То, что вы читаете в вики, правильно. Titan может использовать только «стандартные индексы» для точных совпадений. Обратите внимание, что происходит, когда я пробую этот код в консоли Titan:

gremlin> g.V.has('mytext',Text.REGEX,'.*vertex.*').map;
WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [(mytext REGEX .*vertex.*)]. For better performance, use indexes
==>{mytext=i am the first vertex., age=123}
==>{mytext=hello from a vertex., age=456}

Как видите, индексы (стандартные или иные) не используются. Titan просто выполняет оценку регулярного выражения в памяти. Если бы вы определили индекс ElasticSearch на mytext, Titan понял бы это и оптимизировал запрос для использования этого индекса, и вы бы не увидели это сообщение.

person stephen mallette    schedule 13.06.2014