0

私はバックエンドとしてelasticsearchでTitan 1.0を使用しています。titan のドキュメントから、elasticsearch を使用するために、インデックスの構築中に mixedIndex を使用することを学びました。私のユースケースと問題は次のとおりです。本屋の登録データ、登録時間のデータ、および名前や年齢などのその他の個人情報用のグラフデータベースを作成しています。特定の時間範囲に登録されたすべてのユーザーを照会したい、つまり、クエリの数値比較関数が必要です。これは私がインデックスを作成する方法です:

PropertyKey propertyKey = mgmt.makePropertyKey("registTime").dataType(Date.class)
    .cardinality(Cardinality.SINGLE).make()

timeIndex = mgmt.buildIndex("registeredTime",Vertex.class)
    .addKey("registTime", Mapping.TEXTSTRING.asParameter())
    .buildMixedIndex("search");

ただし、timeIndex は正常に作成されますが、登録された時刻を次のようにクエリしたい場合は、次のようになります。

g.V().has("registTime", gt("2015-01-01 00:00:00.000+0000"))

それは私に与えます:

WARN  com.thinkaurelius.titan.graphdb.transaction.StandardTitanTx  - Query requires iterating over all vertices [()]. For better performance, use indexes

gremlinコマンドでチェックして、データがすぐそこにあることを確認しましたが、空の結果が得られます。私は何か間違ったことをしていますか?どうすればこの問題を解決できますか?

4

1 に答える 1

1

このエラーは、インデックスがENABLEDまだ作成されていないことを意味します。

Titan インデックスには、、、INSTALLEDおよび状態がREGISTEREDあります。詳細については、こちらをご覧ください。ENABLEDDISABLED

ENABLED使用する前に、インデックスの状態を に設定する必要があります。そうしないと、この警告が表示されます。

これは、インデックスを有効にする方法です。

mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("registeredTime"), SchemaAction.ENABLE).get()
mgmt.commit()

あとは切り替わるまで待って、

ManagementSystem.awaitGraphIndexStatus(graph, propertyKeyIndexName)
                    .status(SchemaStatus.ENABLED)
                    .timeout(10, ChronoUnit.MINUTES) // set timeout to 10 min
                    .call();

したがって、これ以降、追加されたすべてのデータがインデックス化されます。すでに追加されたデータにインデックスを付けたい場合:

mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("registeredTime"), SchemaAction.REINDEX).get()
mgmt.commit()

詳細については、こちらとこちらのドキュメントをお読みください

于 2016-06-01T10:52:32.787 に答える