【问题标题】:How to create nested boolean query with lucene API (a AND (b OR c))?如何使用 lucene API (a AND (b OR c)) 创建嵌套布尔查询?
【发布时间】:2023-03-19 13:51:02
【问题描述】:

我有一个包含三个字段(userId、title、description)的索引对象。我想查找标题或描述包含给定关键字的特定用户的所有对象。

我有这样的事情(但这显然是错误的):

WildcardQuery nameQuery = new WildcardQuery(new Term("name", filter.getSearch()));
WildcardQuery descQuery = new WildcardQuery(new Term("description", filter.getSearch()));

TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+""));

BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(new BooleanClause(name_query, Occur.SHOULD));
booleanQuery.add(new BooleanClause(desc_query, Occur.SHOULD));
booleanQuery.add(new BooleanClause(user_query, Occur.MUST));

如何修改代码以获取所有具有正确 ID 和标题或描述中的搜索短语的对象?

【问题讨论】:

    标签: java api lucene


    【解决方案1】:

    我认为它会是这样的:

    TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+""));
    
    BooleanQuery orQuery = new BooleanQuery();
    orQuery.add(new BooleanClause(name_query, Occur.SHOULD));
    orQuery.add(new BooleanClause(desc_query, Occur.SHOULD));
    
    BooleanQuery andQuery = new BooleanQuery();
    andQuery.add(new BooleanClause(userQuery , Occur.MUST));
    andQuery.add(new BooleanClause(orQuery, Occur.MUST));
    

    【讨论】:

      【解决方案2】:

      我相信您需要使用 Query.mergeBooleanQueries 方法来创建一个查询,该查询是前两个的有效 OR。

      所以在第 3 行是这样的:

      Query nameOrDescQuery = Query.mergeBooleanQueries(new Query[] { nameQuery, descQuery });
      

      然后在此之上创建一个新的BooleanClause,而不是单个子句。

      这应该确保您在 name/desc 过滤器上获得 OR 逻辑,而不是当前的 AND 逻辑。

      【讨论】:

        猜你喜欢
        • 2015-10-14
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2017-07-14
        • 2011-06-13
        • 2013-12-10
        • 1970-01-01
        • 2014-09-27
        相关资源
        最近更新 更多