【问题标题】:"OR" query in lucenelucene 中的“或”查询
【发布时间】:2022-11-26 23:21:53
【问题描述】:

我正在尝试设计一个电影数据库的信息检索系统。我想按标题搜索,所以当我搜索“Cobra Kai”时,我的分析器将这个字符串分解为“cobra kai”、“cobra”和“kai”以进行更好的配对。所以我的问题是我必须执行这样的查询:“cobra kai”或“cobra”或“kai”,但它对我不起作用。这是代码:

ArrayList<String> busqueda_separada = muestraTexto(analyzer_titulo(), busquedaTitulo.getText());
                        
                        query1 = new TermQuery(new Term("titulo" ,busqueda_separada.get(0)));
                        query2 = new TermQuery(new Term("titulo" ,busqueda_separada.get(1)));
                        query3 = new TermQuery(new Term("titulo" ,busqueda_separada.get(2)));

                        nested.add(query1, BooleanClause.Occur.SHOULD);
                        nested.add(query2, BooleanClause.Occur.SHOULD);
                        nested.add(query3, BooleanClause.Occur.SHOULD);

                        bqbuilder.add(nested, BooleanClause.Occur.MUST);

这是我的错误:

我试图做不同的布尔子句,但它保持不变。

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    从报错信息中我们可以看出,你已经将nested定义为BooleanQuery类型的变量。

    正如错误消息所说,类BooleanQuery 没有方法add(Query, Occur)。这意味着以下行将不会编译:

    nested.add(query1, BooleanClause.Occur.SHOULD);
    

    相反,代码应该在这里使用 BooleanClause,而不是 BooleanQuery

    一个BooleanQuery由一个或多个子句组成,使用BooleanClause

    因此,您可以执行以下操作:

    BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();
    
    Query query1 = new TermQuery(new Term("titulo", "cobra kai"));
    Query query2 = new TermQuery(new Term("titulo", "cobra"));
    Query query3 = new TermQuery(new Term("titulo", "kai"));
    
    BooleanClause nested1 = new BooleanClause(query1, BooleanClause.Occur.SHOULD);
    BooleanClause nested2 = new BooleanClause(query2, BooleanClause.Occur.SHOULD);
    BooleanClause nested3 = new BooleanClause(query3, BooleanClause.Occur.SHOULD);
    
    bqBuilder.add(nested1);
    bqBuilder.add(nested2);
    bqBuilder.add(nested3);
    
    BooleanQuery bq = bqBuilder.build();
    

    这构建了一个包含 3 个子句的布尔查询:

    查找包含“cobra kai”或“cobra”或“kai”的标题。

    我不确定这是为了什么:

    bqbuilder.add(nested, BooleanClause.Occur.MUST);
    

    BooleanClause.Occur.MUST 似乎不需要,因此我已将其从我的代码中删除。


    您可以使用循环来简化上面的代码。

    假设您已经有一个包含搜索词的列表(您的busqueda_separada 列表):

    List<String> terms = Arrays.asList("cobra kai", "cobra", "kai");
    

    您可以按如下方式使用该列表:

    for (String term : terms) {
        Query query = new TermQuery(new Term("titulo", term));
        BooleanClause nested = new BooleanClause(query, BooleanClause.Occur.SHOULD);
        bqBuilder.add(nested);
    }
    BooleanQuery bq2 = bqBuilder.build();
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多