通过id列表限制/过滤lucene搜索(IN运算符)

时间:2016-06-01 15:57:06

标签: java hibernate filter lucene hibernate-search

我想搜索邮件,例如根据他们的头衔和主题。 但是我有一个带有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);

1 个答案:

答案 0 :(得分:0)

使用嵌套的正确组合创建BooleanQuery的一般方法必须 元素是正确的:这应该有效。

您可能在编码“id”术语方面存在一些问题,或者在“subject”上有类似问题:您需要使用BooleanQuery的这些子句来使用精确的关键字匹配,并自行分割输入条件。

这有时是可取的,但有点容易出错,因为编码需要完全相同,包括每个关键字的情况:如果BooleanQuery与您的元素匹配,您可能需要确保单个子句期待。

我建议在合并各种Lucene Query 实例之前引入单个元素的测试,以便您可以验证任何文本处理是否匹配,然后才将它们与布尔运算符组合。 / p>