7

Lucene SpanQuery を使用して、「赤」、「緑」、「青」という用語がすべて 1 つの文に含まれる箇所をすべて見つけることはできますか?

私の最初の (不完全/不正確な) アプローチは、特別なセンテンス マーカー トークンとセンテンスの先頭をセンテンスの最初の単語と同じ位置に配置し、次のようなクエリを実行するアナライザーを作成することです。

SpanQuery termsInSentence = new SpanNearQuery(
  SpanQuery[] {
    new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN)),
    new SpanTermQuery( new Term ("red")),
    new SpanTermQuery( new Term ("green")),
    new SpanTermQuery( new Term ("blue")),
  },
  999999999999,
  false
);

SpanQuery nextSentence = new SpanTermQuery( new Term (MY_SPECIAL_SENTENCE_TOKEN));

SpanNotQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence);

もちろん問題は、それnextSentenceが実際には次の文ではなく、一致する文の中のものを含む任意の文マーカーであることです。termsInSentenceしたがって、これは機能しません。

次のアプローチは、トークンを文の前(つまり、最初の単語と同じ位置ではなく、最初の単語の前) に配置するアナライザーを作成することです。これに関する問題は、 によって引き起こされる余分なオフセットを考慮しなければならないことですMY_SPECIAL_SENTENCE_TOKENさらに、 USS Enterprise/\.\s+[A-Z0-9]/を検索するときにすべての (偽の) 文マーカーを考慮する必要があるため、単純なパターンを使用して文を分割する (例: split on ) 場合、これは最初は特に問題になります。

では...どうやってこれにアプローチすればいいですか?

4

2 に答える 2

1

各文を Lucene ドキュメントとして索引付けし、その文がどのソース ドキュメントから来たかを示すフィールドを含めます。ソース マテリアルによっては、文/LuceneDoc のオーバーヘッドが許容される場合があります。

于 2013-01-24T11:59:11.420 に答える