lucene,搜索包含一个词两次的句子

lucene, search for sentences that contain one term twice

我有一对搜索字符串,我想使用 Lucene 搜索包含这些字符串中包含的所有术语的句子。因此,例如,如果我有两个搜索字符串 "white shark" 和 "fish",我想要所有包含 "white"、"shark" 和 "fish" 的句子。显然,使用 Lucene,这可以通过布尔查询很容易地完成;这就是我在代码中的做法:

String search =  str1+" "+ str2;
BooleanQuery booleanQuery = new BooleanQuery();
QueryParser queryParser = new QueryParser(...);
queryParser.setDefaultOperator(QueryParser.Operator.AND);
booleanQuery.add(queryParser.parse(search), BooleanClause.Occur.MUST);

但是,我也有成对的搜索字符串,其中一个字符串是另一个字符串的一部分,例如"timber wolf" 和 "wolf",在这些情况下,我只想得到包含 "wolf" 至少两次(和 "timber" 至少一次)的句子。有什么办法可以用 Lucene 实现这一目标吗?非常感谢您的回答!

请记住,同时具有 "timber wolf" 和单独的 "wolf" 的文档得分更高 其他条件相同,因为术语"wolf" 出现两次,给予它更高的 tf 分数。在大多数情况下,像这样,想要的结果是第一个是可以接受的,通常甚至是可取的。

就是说,我相信您可以使用带有斜率的短语查询并将斜率设置得足够高来获得您想要的结果。类似于:

"timber wolf wolf"~10000

对于大多数情况,这可能已经足够高了。这将需要 wolf 的两个实例和 timber.

的一个实例

但是,如果您需要 timber wolf 出现(即,这两个术语相邻且按顺序),您将需要放弃查询解析器,并自己构造适当的查询。 SpanQueries,具体来说。

SpanQuery wolfQuery = new SpanTermQuery(new Term("myField", "wolf"));
SpanQuery[] timberWolfSubQueries = {
    new SpanTermQuery(new Term("myField", "timber")),
    new SpanTermQuery(new Term("myField", "wolf"))
};
//arguments "0, true" mean 0 slop and in order (respectively)
SpanQuery timberWolfQuery = new SpanNearQuery(timberWolfSubQueries, 0, true);
SpanQuery[] finalSubQueries = {
    wolfQuery, timberWolfQuery
};
//arguments "10000, false" mean 10000 slop and not (necessarily) in order
SpanQuery finalQuery = new SpanNearQuery(finalSubQueries, 10000, false);