簡単な質問かもしれませんが、この状況を処理する方法がわかりません。
Lucene インデックスでドキュメントを検索したいのですが、ドキュメントには保存されたフィールドがcontent
あり、そのテキストは次のようにトークン化されています。
DELIMITER_TOKEN
TOKEN_1 |
TOKEN_2 | <- this is the first "block"
... | (bounded by some delimiter tokens)
TOKEN_N |
DELIMITER_TOKEN
TOKEN_1 |
TOKEN_2 | <- another block...
... |
DELIMITER_TOKEN
... | <- and so on...
TOKEN_1
たとえば、、、TOKEN_3
およびを含むTOKEN_8
が、同じDELIMITER_TOKEN
ペアの間にあるドキュメントを検索したい。
私の最初のアイデアはSpanNearQuery
、大きなスロップで検索された用語の を作成してSpanNotQuery
から、重複する DELIMITER_TOKEN を前のクエリの一致から除外するために使用できる を作成できるので、次のような一致は得られないということでした。
DELIMITER_TOKEN
TOKEN_1
TOKEN_3
DELIMITER_TOKEN
TOKEN_8
この解決策はうまくいくはずです。
ただし、検索など、より複雑なケースを処理する必要がある場合があります。
TOKEN_1 TOKEN_2 TOKEN_8 DELIMITER_TOKEN TOKEN_3 DELIMITER_TOKEN
...これは、TOKEN_1、TOKEN_2、および TOKEN_8 トークンを (とりわけ) 含むドキュメントで「ブロック」を見つけたいことを意味し、その隣に TOKEN_3 (とりわけ) を含むブロックがあります。
私の考えは、単純なケースのように SpanNotQueries を使用し、次のように SpanNearQuery を作成することです。
new SpanNearQuery(new SpanQuery[] {
queryForFirstBlock,
queryForDelimiter,
queryForSecondBlock}
0,
true);
しかし、最初のブロックのクエリが必ずしもブロック全体に及ぶとは限らないため、これは機能しないと思います。これらのケースを処理するには、この最後の Near Query にスロップを導入する必要があると思います。しかし、0 より大きい slop を導入することを選択した場合、次のような一致が可能になります。
DELIMITER_TOKEN
TOKEN_1 | |
TOKEN_2 | first near query |
TOKEN_8 | |
DELIMITER_TOKEN | the top query
TOKEN_X |
DELIMITER_TOKEN | delitimer |
TOKEN_3 | second near query |