3

Apache Lucene で提供されるヒット ハイライターに関して 2 つの質問があります。

  1. この関数を参照してください。トークン ストリーム パラメータの使用について説明していただけますか。

  2. 多くのフィールドを含むいくつかの大きな lucene ドキュメントがあり、各フィールドにはいくつかの文字列が含まれています。これで、特定のクエリに最も関連するドキュメントが見つかりました。クエリ内のいくつかの単語がドキュメント内の単語と一致した可能性があるため、このドキュメントが見つかりました。クエリ内のどの単語がこれを引き起こしたのかを知りたいです。そのため、Lucene Hit Highlighter を使用する予定です。例: クエリが「skin doctor delhi」で、「dermatologist」というタイトルのドキュメントに「skin」と「doctor」という単語が含まれている場合、ヒットを強調表示した後、クエリから「skin」と「doctor」を分離できるはずです。私はこの数週間、このためのコードを書こうとしてきました。欲しいものを手に入れることができません。私を手伝ってくれますか?

前もって感謝します。

アップデート:

現在のアプローチ: ドキュメント内のすべての単語を含むクエリを作成します。

Field[] field = doc.getFields("description");
String desc = "";
for (int j = 0; j < field.length; ++j) {
     desc += field[j].stringValue() + " ";
}

Query q = qp.parse(desc);
QueryScorer scorer = new QueryScorer(q, reader, "description");
Highlighter highlighter = new Highlighter(scorer);

String fragment = highlighter.getBestFragment(analyzer, "description", text);

小さな文書には機能しますが、大きな文書には機能しません。次のスタックトレースが取得されます。

    org.apache.lucene.search.BooleanQuery$TooManyClauses: maxClauseCount is set to 1024
    at org.apache.lucene.search.BooleanQuery.add(BooleanQuery.java:152)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:891)
    at org.apache.lucene.queryParser.QueryParser.getBooleanQuery(QueryParser.java:866)
    at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1213)
    at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167)
    at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182)

このアプローチが大規模なドキュメントに対して不合理であることは明らかです。これを修正するにはどうすればよいですか?

ところで、私は FuzzyQuery マッチングを使用しています。

4

1 に答える 1

2

編集: Explain() に関する詳細を追加しました。

一般的な紹介: Lucene Highlighter は、ヒットしたドキュメントからテキスト スニペットを検索し、クエリに一致するトークンを強調表示することを目的としています。

  1. したがって、TokenStream パラメータを使用して、ヒット テキストをトークンに分割します。次に、ハイライターのスコアラーは、フラグメントをスコアリングし、強調表示するスニペットとトークンを選択するために、各トークンをスコアリングします。
  2. 私はあなたがそれを間違っていると信じています。ドキュメント内でどのクエリ用語が一致したかを理解したいだけの場合は、explain()メソッドを使用する必要があります。基本的に、サーチャーをインスタンス化した後、次を使用します。

Explanation expl = searcher.explain(query, docId);

String asText = expl.toString();

String asHtml = expl.toHtml();

docId は、検索結果からの生のドキュメント ID です。

スニペットやハイライトが必要な場合にのみ、ハイライターを使用してください。それでも蛍光ペンを使いたい場合は、Nicholas Hrychan のアドバイスに従ってください。ただし、彼が Lucene 2.4.1 API について説明しているので注意してください。より高度なバージョンを使用する場合は、「SpanScorer」と呼ばれる「QueryScorer」を使用する必要があります。

于 2010-03-10T12:07:58.880 に答える