2016-04-18 4 views
1

Titan 1.0 [Berkeley + Remote Elastic Search] このタイタンの組み合わせを使用しています。以下はプロパティファイルです -Titan 1.0 [Berkeley + ES] - ESインデックスの遅延アップデート

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

インデックスを作成するためのコードがある - これはTitan mailing listに以前に議論されている

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

} 

答えて

1

ES索引付け(index.refresh_interval)に遅延があることに注意してください。 値を更新/挿入してすぐに値を照会することはできません。値を照会する前に を1秒以上待機してください。そうでない場合は、結果は になります。

ます。また、インデックスの行動にElasticsearchドキュメント(modifying your datanear real-time search)をよく読んでください。

Elasticsearchがリアルタイムに近い でのデータの操作や検索機能を提供します。デフォルトでは、データのインデックス登録/更新/削除から検索結果に表示される の時刻までに1秒の遅延(リフレッシュ 間隔)が発生します。これは、トランザクションが完了した後すぐにデータが であるSQLのような他のプラットフォームとは区別されて重要です。

注意refresh_intervalは、1s(1秒)または2m(2 分)として時間を見込んでいます。 1のような絶対数は、1ミリ秒を意味します。 への確実な方法は、あなたのクラスタを膝に持っていくことです。

+1

ありがとうございました。私は検索しようとしましたが、関連情報は得られませんでした。あなたの反応は上です。 – Akshaya

+0

ここでは、レコードをリアルタイムで照会する必要があったため、これを達成したいと考えています。 – Akshaya

+0

グラフデータを検索したいので、部分検索のNGRAMサポートが必要です。残念ながら、デフォルトのESインデックス(Titan)ではこれを達成できませんでした。カスタム索引作成のサポートでは不十分です。だから私たちは望みの設定で別のインデックス(ngram)を作成しました。 これで同期をとる仕事があるので、データをタイタンインデックスからngramインデックスに更新し続ける必要があります。我々はまた、これらのレコードのIDを同じにしたいと考えました。レコードが更新されるときと同様に、私たちはタイタンインデックスをクエリし、データを取得して、同じインデックスIDを持つngramにコピーします。 – Akshaya