也许这是一个简单的问题,但我不知道如何处理这种情况。
我想在 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_TOKENs,这样我就不会得到像这样的匹配项
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 中引入一些 slop 来处理这些情况。但是如果我选择引入大于 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 |