質問

ディレクトリでインデックスを作成したデータを検索するために、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 annotations @field、 @indexedembedded、...これはフィールドのインデックスの方法を示すため、FullTextEntityManagerインスタンスでindex()メソッドを呼び出すときにこの情報を使用してオブジェクトにインデックスを作成することです。ディレクトリ内。この情報を使用してメモリ内でインデックスを作成する同様の方法はありますか?

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

役に立ちましたか?

解決

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

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

結果が得られた場合、クエリが一致していることがわかります。

他のヒント

MemoryIndexは、Luceneのディレクトリまたはインデックスリーダーを拡張または実装しない完全に個別のコンポーネントであるため、これをHibernate Search Annotationsにプラグインする方法はないと思います。 MemoryIndexを使用することを選択した場合、Addfield()コールを書く必要があると推測しています。

ここではいくつのクエリについて話しているのですか? Hibernateが維持するメインインデックスでクエリを実行するだけで逃げることができるかもしれない数が逃げることができるかもしれません。または、追加されたすべてのドキュメントについて、RamDirectoryを使用して1ドキュメント内インデックスを作成し、それを通してクエリを実行します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top