Индексация Titan с эластичным поиском. Проблема сопоставления строк

У меня возникли проблемы с индексацией для работы с Titan. Я настраиваю свой индекс следующим образом:

TitanGraph graph = TitanFactory.open("conf/titan-cassandra-es.properties");
TitanManagement management = graph.openManagement();
String indexKey = "byItemIdentifier";
String propertyKey = "ITEM_IDENTIFIER";
TitanIndex index = management.getGraphIndex(indexKey);
PropertyKey key = management.makePropertyKey(propertyKey).dataType(String.class).make();
management.buildIndex(indexKey, Vertex.class).addKey(key, Mapping.STRING.asParameter()).buildMixedIndex("search");
management.commit();

Теперь проблема:

Vertex vertex = graph.addVertex();
vertex.property(propertyKey, "www.foo.com/bar");
graph.commit();

Затем позже я пробую следующее:

graph.traversal().V().has(propertyKey, "foo").hasNext(); //(1)
graph.traversal().V().has(propertyKey, "bar").hasNext(); //(2)
graph.traversal().V().has(propertyKey, "www.foo.com/bar").hasNext(); //(3)

(1) = false, (2) = false и (3) = false. Как это происходит? Конечно, (3) должен возвращать true ? Я что-то неправильно настроил?


person Filipe Teixeira    schedule 11.01.2016    source источник
comment
Не ответ на ваш вопрос, но вам действительно нужен смешанный индекс? Вы можете выполнять тесты на равенство с помощью внутренних составных индексов Titan. Лично я из-за проблемы 788 старался избегать смешанных индексов. .   -  person Ralf    schedule 14.01.2016
comment
@Ralf на данный момент я перешел на использование составных индексов, и этого достаточно. Спасибо за указание на проблему.   -  person Filipe Teixeira    schedule 14.01.2016


Ответы (1)


Во-первых, сразу после создания индекса нужно дождаться, пока он перейдет из установленного в зарегистрированный. Этот метод поможет:

// Block until the SchemaStatus transitions from INSTALLED to REGISTERED
ManagementSystem.awaitGraphIndexStatus(graph, vertices_index).status(SchemaStatus.REGISTERED).call();

Это блокирует ваш код до тех пор, пока ваш сервер индексирования не создаст его.

Во-вторых, если в графе уже есть какие-то данные, вы ДОЛЖНЫ переиндексировать свои свойства, чтобы серверная часть индексации (Elasticsearch и т. д.) могла знать об этом. Используйте этот метод Java:

public static void reindexGraph(TitanGraph graph, String myIndex) throws InterruptedException {
    TitanManagement management = graph.openManagement();
    TitanGraphIndex index = management.getGraphIndex(myIndex);
    management.updateIndex(index, SchemaAction.REINDEX);
    management.commit();

    // Enable the index
    ManagementSystem.awaitGraphIndexStatus(graph, myIndex).status(SchemaStatus.ENABLED).call();
    graph.tx().commit();
}
person Mohamed Taher Alrefaie    schedule 15.01.2016