Titan 1.0 [Berkeley+ES] — отложенное обновление индекса ES

Titan 1.0 [Berkeley+ Remote Elastic Search] мы используем эту комбинацию Titan. Ниже приведен файл свойств -

storage.backend=berkeleyje
storage.directory=D:/other-projects/graph-db/titan/enron-tk3/db/berkeley
index.search.backend=elasticsearch
index.search.index-name=akshayatitan
index.search.hostname=localhost
index.search.elasticsearch.client-only=true
index.search.elasticsearch.local-mode=false

Мы используем только смешанный индекс.
Теперь мы добавляем узел с несколькими свойствами через код Java, а затем извлекаем его.

Мы запрашиваем свойство, для которого создается смешанный индекс.
Когда мы запрашиваем узел обратно по ключу (тот, для которого создается смешанный индекс), мы не получаем узел сразу. Однако он становится доступным с задержкой.
Что мы делаем не так? Или ожидается отложенное обновление экземпляра ES?
Вот код Java.

public static void main(String[] args) throws Exception {
    GraphTest test = new GraphTest();
    test.init();
    Thread.sleep(10000);

    String emailId = "emailId" + System.nanoTime();
    test.createNode(emailId);
    System.out.println("Create " + emailId);
    System.out.println("First time " + test.getNode(emailId));
    Thread.sleep(2000);
    System.out.println("After a delay of 2 sec " + test.getNode(emailId));
}

public void createNode(String emailid) {
    Vertex vertex = graph.addVertex("person");
    vertex.property("emailId", emailid);
    vertex.property("firstName", "First Name");
    vertex.property("lastName", "Last Name");
    vertex.property("address", "Address");
    vertex.property("hometown", "Noida");
    vertex.property("city", "Noida");
    vertex.property("spousename", "Preeti");

    graph.tx().commit();

}

public Object getNode(String emailId) {
    Vertex vert = null;
    String reString = null;
    try {
        vert = graph.traversal().V().has("emailId", emailId).next();
        reString = vert.value("emailId");
    } catch (NoSuchElementException e) {
        e.printStackTrace();
    } finally {
        graph.tx().close();
    }

    return reString;
}

Код для создания индекса -

    private void createMixedIndexForVertexProperty(String indexName, String propertyKeyName, Class<?> propertyType) {

    TitanManagement mgmt = ((TitanGraph) graph).openManagement();
    try {
        PropertyKey propertyKey = makePropertyKey(propertyKeyName, propertyType, mgmt);
        TitanGraphIndex graphIndex = mgmt.getGraphIndex(indexName);
        if (graphIndex == null) {
            graphIndex = mgmt.buildIndex(indexName, Vertex.class)
                    .addKey(propertyKey, Parameter.of("mapping", Mapping.STRING)).buildMixedIndex("search");
        } else {
            mgmt.addIndexKey(graphIndex, propertyKey);
        }
        mgmt.commit();
    } catch (Exception e) {
        mgmt.rollback();
    } finally {
    }

}

public PropertyKey makePropertyKey(String propertyKeyName, Class<?> propertyType, TitanManagement mgmt) {

    PropertyKey propertyKey = mgmt.getPropertyKey(propertyKeyName);
    if (propertyKey == null) {
        propertyKey = mgmt.makePropertyKey(propertyKeyName).dataType(String.class).make();
    }
    return propertyKey;
}

public void init() throws Exception {
    graph = TitanFactory
            .open(new PropertiesConfiguration(new File("src/test/resources/titan-berkeleydb-es.properties")));
    createMixedIndexForVertexProperty("personnode", "emailId", String.class);
    createMixedIndexForVertexProperty("personnode", "firstName", String.class);
    createMixedIndexForVertexProperty("personnode", "lastName", String.class);
    createMixedIndexForVertexProperty("personnode", "address", String.class);
    createMixedIndexForVertexProperty("personnode", "hometown", String.class);
    createMixedIndexForVertexProperty("personnode", "city", String.class);
    createMixedIndexForVertexProperty("personnode", "spousename", String.class);

}

person Akshaya    schedule 18.04.2016    source источник


Ответы (1)


Это обсуждалось ранее в списке рассылки Titan.

обратите внимание, что в индексировании ES есть задержка (index.refresh_interval). Вы не можете обновить/вставить значение и сразу запросить его. Подождите не менее 1 секунды, прежде чем запрашивать значение, иначе результат может быть пустым.

Вам также следует ознакомиться с документацией Elasticsearch (изменение ваших данных и поиск почти в реальном времени) о поведении индексации:

Elasticsearch обеспечивает манипулирование данными и возможности поиска почти в реальном времени. По умолчанию вы можете ожидать задержку в одну секунду (интервал обновления) с момента индексации/обновления/удаления данных до момента их появления в результатах поиска. Это важное отличие от других платформ, таких как SQL, где данные доступны сразу после завершения транзакции.

ВНИМАНИЕ refresh_interval ожидает такую ​​продолжительность, как 1s (1 секунда) или 2m (2 минуты). Абсолютное число, такое как 1, означает 1 миллисекунду — верный способ поставить ваш кластер на колени.

person Jason Plurad    schedule 18.04.2016
comment
Спасибо Джейсон. Я пытался искать, но не получил соответствующей информации. Ваш ответ в точку. - person Akshaya; 20.04.2016
comment
Вот использование, которого мы хотим добиться, из-за которого нам пришлось запрашивать запись в режиме реального времени. - person Akshaya; 21.04.2016
comment
Мы хотим искать данные графа, поэтому нам нужна поддержка NGRAM для частичного поиска. К сожалению, мы не смогли добиться этого с индексом ES по умолчанию (Titan). Поддержки создания пользовательского индекса недостаточно. В итоге мы создали еще один индекс (ngram) с желаемой конфигурацией. Теперь у нас есть работа по их синхронизации, поэтому необходимо постоянно обновлять данные из titan index в ngram index. Мы также хотели сохранить одинаковые идентификаторы этих записей. Поэтому, когда запись обновляется, мы запрашиваем индекс титана, получаем данные и копируем их в ngram с тем же идентификатором индекса. - person Akshaya; 21.04.2016
comment
Именно для синхронизации идентификаторов нам приходилось запрашивать у титана в режиме реального времени, что привело к этой проблеме. Однако мы обнаружили, что ES id =LongEncoding.encode(vertex id) Этот подход с двумя источниками данных является проблемой, однако с ограниченной поддержкой настройки индекса (из того, что мы собрали до сих пор) это сложно. Я думаю, что это должно быть хорошим вариантом использования, и можно было бы обеспечить улучшение. - person Akshaya; 21.04.2016