我想搜索邮件,例如根据他们的头衔和主题。 但是我有一个带有ID的列表,其中lucene可以搜索。
我只是想在id上添加一个限制..看起来像一个简单的任务,但找不到解决方案......
所以基本上:(搜索查询)AND(id IN(list-of-id))。
据我所知,lucene中没有IN-operator。
我尝试过结合使用BooleanJunctions,但到目前为止还没有成功
我已经尝试过实现一个过滤器,但这需要一个DocIdSet / DocIdSetIterator,这很奇怪。
它是用Java实现的,而lucene的版本是3.6.2。
我尝试过的东西:
final FullTextSession fullTextSession = Search.getFullTextSession(getSession());
final QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Message.class).get();
final BooleanJunction<?> booleanJunction = queryBuilder.bool();
final String[] searchTerms = StringUtils.split(criteria, "\\W+");
for (final String term : searchTerms) {
if (StringUtils.length(term) > 2) {
BooleanJunction<?> booleanJunctionIds = queryBuilder.bool();
for (Long id : messageIds) {
booleanJunctionIds.must(queryBuilder.keyword().onField("id").matching(id).createQuery());
}
BooleanJunction<?> booleanJunctionSearch = queryBuilder.bool();
booleanJunctionSearch.should(queryBuilder.keyword().onFields("subject").matching(criteria).createQuery());
/**...**/
booleanJunction.must(booleanJunctionIds.createQuery()).must(booleanJunctionSearch.createQuery()).createQuery();
}
}
final FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(booleanJunction.createQuery(), Message.class);
答案 0 :(得分:0)
使用嵌套的正确组合创建BooleanQuery的一般方法必须和 元素是正确的:这应该有效。
您可能在编码“id”术语方面存在一些问题,或者在“subject”上有类似问题:您需要使用BooleanQuery的这些子句来使用精确的关键字匹配,并自行分割输入条件。
这有时是可取的,但有点容易出错,因为编码需要完全相同,包括每个关键字的情况:如果BooleanQuery与您的元素匹配,您可能需要确保单个子句期待。
我建议在合并各种Lucene Query 实例之前引入单个元素的测试,以便您可以验证任何文本处理是否匹配,然后才将它们与布尔运算符组合。 / p>