5

多分私は本当に何かが欠けています。

Lucene で一連のキーと値のペアのインデックスを作成しました (重要な場合は v4.1)。たとえば、プロパティ ファイルから読み取ったように、key1=value1 と key2=value2 があるとします。

それらは、特定のフィールドとして、およびキャッチオール「ALL」フィールドの両方に索引付けされます。

new Field("key1", "value1", aFieldTypeMimickingKeywords);
new Field("key2", "value2", aFieldTypeMimickingKeywords);
new Field("ALL", "key1=value1", aFieldTypeMimickingKeywords);
new Field("ALL", "key2=value2", aFieldTypeMimickingKeywords);
// then get added to the Document of course...

次に、次を使用してワイルドカード検索を実行できます

new WildcardQuery(new Term("ALL", "*alue1"));

そしてそれはヒットを見つけるでしょう。

しかし、「そのヒットに対応する完全な値 (例: "key1=value1") は何だったのか?」などの詳細情報が得られると便利です。

ドキュメントを取得し、IndexableFields のリストを取得し、それらすべてをループして、field.stringValue().contains("alue1") かどうかを確認するのが最善の方法です。(デバッガーでデータ構造を見ることができ、すべての情報がそこにあります)

これは完全に非常識な原因のように思えますが、それはLucene が行ったことではありませんか? ヒット情報はいくつかのフィールドを返すべきではありませんか?

Lucene には「明白な」機能のように見えるものが欠けていますか? Google と API から始めて、簡単なことは明らかにされていませんが、間違ったものを検索しているに違いないと感じています。

4

1 に答える 1

5

IndexSearcher.explain()メソッドを試してみることをお勧めします。一致するドキュメントのIDを取得したら、(同じ検索キーワードを使用して)各フィールドのクエリを準備し、クエリごとにExplanation.isMatch()を呼び出します。trueを生成するものは一致するフィールドを提供します。例:

for (String field: fields){
    Query query = new WildcardQuery(new Term(field, "*alue1"));
    Explanation ex = searcher.explain(query, docID);
    if (ex.isMatch()){
        //Your query matched field
    }
}
于 2013-03-04T17:46:11.163 に答える