3

ディレクトリでインデックスを作成したデータを検索するために、Hibernate Search (Lucene を使用) を使用しています。正常に動作しますが、逆検索を行う必要があります。逆検索とは、データベースにクエリのリストが保存されていることを意味し、データ オブジェクトが作成されるたびに、これらのクエリのどれがデータ オブジェクトと一致するかを確認する必要があります。ユーザーが作成したクエリとデータ オブジェクトが一致したときにユーザーに警告する必要があります。したがって、作成したばかりのこの単一のデータ オブジェクトにインデックスを付け、リストのどのクエリが結果としてこのオブジェクトを持っているかを確認する必要があります。

メモリ内にインデックスを作成する Lucene MemoryIndex クラスを見たので、リスト内のすべてのクエリに対して次の例のようなことを行うことができます (ただし、クエリの Java リストでの反復はあまり効率的ではありません)。

//Iterating over my list<Query>
MemoryIndex index = new MemoryIndex();
//Add all fields
index.addField("myField", "myFieldData", analyzer);
...
QueryParser parser = new QueryParser("myField", analyzer);
float score = index.search(query);
if (score > 0.0f) {
    System.out.println("it's a match");
} else {
    System.out.println("no match found");
}

ここでの問題は、このデータ クラスにはいくつかの Hibernate Search アノテーション @Field、@IndexedEmbedded が含まれていることです。これは、フィールドのインデックス付け方法を示しているため、FullTextEntityManager インスタンスで index() メソッドを呼び出すと、この情報を使用してオブジェクトにインデックスが付けられます。ディレクトリで。この情報を使用してメモリ内でインデックスを作成する同様の方法はありますか?

この逆検索を行うより効率的な方法はありますか?

4

2 に答える 2

5

新しいオブジェクトにインデックスを付けるだけです (自動インデックスを使用する場合は、現在のトランザクションをコミットする以外に何もする必要はありません)。次に、実行するクエリを取得し、それらすべてをブールクエリで実行して、保存されたクエリを新しいオブジェクトの ID。このようなもの:

...
BooleanQuery query = new BooleanQuery();
query.add(storedQuery, BooleanClause.Occur.MUST);
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST);
... 

結果が得られれば、クエリが一致したことがわかります。

于 2010-11-13T11:08:47.700 に答える
0

MemoryIndex は、Lucene の Directory または IndexReader を拡張または実装しない完全に独立したコンポーネントであるため、これを Hibernate Search Annotations にプラグインする方法はないと思います。MemoryIndex を使用することを選択した場合は、注釈で行っていることを基本的に反映する addField() 呼び出しを記述する必要があると思います。

ここではいくつのクエリについて話しているでしょうか? その数によっては、Hibernate が維持するメイン インデックスに対してクエリを実行するだけで済む場合があり、追加したばかりのドキュメント ID に検索を制限することが保証されます。または、追加されたドキュメントごとに、RAMDirectory を使用して 1 つのドキュメントのインメモリ インデックスを作成し、それを通じてクエリを実行します。

于 2010-04-16T19:44:26.910 に答える