代码之家  ›  专栏  ›  技术社区  ›  Arne Deutsch

如何使用luceneapi(a和(b或c))创建嵌套布尔查询?

  •  12
  • Arne Deutsch  · 技术社区  · 14 年前

    我有这样的想法(但这显然是错误的):

    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和标题或描述中的搜索短语的对象?

    2 回复  |  直到 14 年前
        1
  •  24
  •   Bartek Jablonski    7 年前

    我想应该是这样的:

    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
  •  0
  •   Andrzej Doyle    14 年前

    Query.mergeBooleanQueries 方法创建一个查询,该查询是前两个查询中有效的或。

    第三行是这样的:

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

    然后创建一个新的 BooleanClause

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