0

Lucene を使用して一連の文にインデックスを付けています。私のクエリには2つの「エンティティ」があり、次のような近接クエリを作成します:

"EntityA EntityB"~22 

この 2 つのエンティティを含むすべての文を最大 22 文字の範囲で取得したいと考えています。ここで、Lucene Highlighter を使用して、2 つのエンティティ間の単語を取得したいと考えています。このようなコードを使用してコンテンツをフラグメントに分割していますが、2 つのエンティティ間の正確な位置にフラグメントを設定する方法がわかりません。

for (int i = 0; i < numTotalHits; i++) {
            int id = hits[i].doc;
            Document doc = searcher.doc(hits[i].doc);
            String text = doc.get("content");
            TokenStream tokenStream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), id , "content", analyzer);
            String[] frag = getFragmentsWithHighlightedTerms(analyzer, query, "content", text, 10, 10);

            for (int j = 0; j < frag.length; j++) {
                    System.out.println((frag[j].toString()));
            }

私の目的は、エンティティ内のテキストを取得することです。たとえば、次のようになります。

entity1 --> Canada
entity2 --> Ottawa
sentence --> Natural Resources Canada, Canadian Forest Service, Ottawa.
result --> , Canadian Forest Service, 
4

1 に答える 1

0

「foo bar」~22 構文は、私の知る限り、22 のスロップを持つフレーズ クエリを作成します。22 は、クエリと同じ順序で 2 つのトークンを互いに近づけるために、最大 22 回の移動が可能であることを指定します。22 の移動には、他のトークンとの場所の切り替えが含まれ、トークンの長さとは関係ありません (このコンテキストでは、トークンは単語を意味します)。

フレーズ クエリで関連する結果を取得すると、2 つのエンティティ間のフラグメント全体を取得する信頼できる方法はないと思います。

クエリ オブジェクトを自分で作成できる場合は、実際には自分で正規表現クエリを使用します。22 文字の範囲について既に言及しているので、それを強調表示します。次に、強調表示されたテキストから 2 つのエンティティを簡単にトリミングできます。

于 2014-06-17T08:05:34.473 に答える