我想搜索邮件,例如根据邮件的标题和主题。但我有一个ID列表,lucene可以在里面搜索。
我只想添加一个对id的限制..看起来是个简单的任务,但是找不到解决方案...
所以基本上:(搜索查询)和(id IN (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);发布于 2016-06-25 00:45:48
使用正确的嵌套必须和应该元素组合创建BooleanQuery的一般方法是正确的:这应该是可行的。
您可能在"id“术语的编码方式上遇到了一些问题,或者在”subject“方面也遇到了类似的问题:您要求BooleanQuery的这些子句使用精确的关键字匹配,并且自己对输入条件进行拆分。
这有时是可取的,但容易出错,因为编码需要完全相同,包括每个关键字的大小写:您可能希望确保各个子句(如果BooleanQuery确实与您期望的元素匹配)。
我建议在合并各种Lucene查询实例之前引入对单个元素的测试,这样您就可以验证任何文本处理都是匹配的,然后才能将它们与布尔运算符组合起来。
https://stackoverflow.com/questions/37573545
复制相似问题