我有成对的搜索字符串,我想使用Lucene搜索包含这些字符串中包含的所有术语的句子。例如,如果我有两个搜索字符串" white shark"和#34; 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);
但是,我也有一对搜索字符串,其中一个字符串是另一个字符串的子部分,例如"木狼"并且"狼",在这些情况下,我想只得到包含"狼"至少两次("木材"至少一次)。 Lucene有没有办法实现这个目标?非常感谢您的回答!
答案 0 :(得分:0)
请记住,一个同时拥有"木狼"还有一只单独的“狼”#34;因为术语" wolf"会得到更高的得分其他所有相等的发生两次,给予更高的tf分数。在大多数情况下,这样的结果是第一个可以接受,通常甚至是可取的。
那就是说,我相信你可以使用slop的短语查询获得你想要的东西,并且将slop设置得足够高。类似的东西:
"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);