2016-04-18 8 views
1

Titan 1.0 [Berkeley + Fernelastische Suche] wir verwenden diese Kombination von Titan. Das Folgende ist die Eigenschaftendatei:Titan 1.0 [Berkeley + ES] - Verzögerte Aktualisierung des ES-Index

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 

Wir verwenden nur gemischten Index.
Jetzt fügen wir einen Knoten mit wenigen Eigenschaften über Java-Code hinzu und holen ihn dann.

Wir fragen nach einer Eigenschaft, auf der ein gemischter Index erstellt wird.
Wenn wir den Knoten zurück mit dem Schlüssel abfragen (einer, bei dem ein gemischter Index erstellt wird), erhalten wir den Knoten nicht sofort. Jedoch wird es nach einer Verzögerung verfügbar.
Was machen wir falsch? Oder wird diese verzögerte Aktualisierung der ES-Instanz erwartet?
Hier ist der Java-Code.

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; 
} 

Der Code-Index zu erstellen ist -

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); 

} 

Antwort

1

Dies vor auf dem Titan mailing list diskutiert wurde.

Beachten Sie, dass bei der ES-Indexierung eine Latenz auftritt (index.refresh_interval). Sie können einen Wert nicht aktualisieren/einfügen und ihn sofort abfragen. Warten Sie bei mindestens 1 Sekunde, bevor Sie den Wert abfragen, andernfalls kann das Ergebnis leer sein.

Sie sollen auch auf dem Spiel Elasticsearch Dokumentation (modifying your data und near real-time search) auf dem Indexierungsverhalten lesen:

Elasticsearch Datenmanipulation und Suchfunktionen in nahezu in Echtzeit zur Verfügung stellt. Standardmäßig können Sie eine Verzögerung von einer Sekunde (Aktualisierung des Intervalls ) ab dem Zeitpunkt des Indexierens/Aktualisierens/Löschens Ihrer Daten bis zur Zeit erwarten, die in Ihren Suchergebnissen angezeigt wird. Dies ist eine wichtige Unterscheidung von anderen Plattformen wie SQL, wobei Daten sofort verfügbar sind , nachdem eine Transaktion abgeschlossen ist.

VORSICHT Die refresh_interval erwartet eine Dauer wie 1s (1 Sekunde) oder 2m (2 Minuten). Eine absolute Zahl wie 1 bedeutet 1 Millisekunde - ein sicherer Weg zu bringen Sie Ihren Cluster in die Knie.

+1

Danke Jason. Ich habe versucht zu suchen, habe aber keine relevanten Informationen bekommen. Ihre Antwort ist genau richtig. – Akshaya

+0

Hier ist die Verwendung, die wir erreichen möchten, aufgrund derer wir den Datensatz in Echtzeit abfragen mussten. – Akshaya

+0

Wir wollen die Grafikdaten durchsuchen und benötigen daher NGRAM-Unterstützung für die partielle Suche. Leider konnten wir dies mit dem Standard-ES-Index (Titan) nicht erreichen. Die Unterstützung für benutzerdefinierte Indexerstellung ist nicht genug. Also haben wir am Ende einen anderen Index (ngram) mit der gewünschten Konfiguration erstellt. Jetzt haben wir einen Job, um sie synchron zu halten, also müssen wir die Daten vom Titan-Index zum Ngram-Index aktualisieren. Wir wollten auch die IDs dieser Datensätze beibehalten. Wenn also ein Datensatz aktualisiert wird, fragen wir den Titan-Index ab, holen die Daten und kopieren sie mit derselben Index-ID nach ngram. – Akshaya