Lucene - “AND”套“OR”术语

时间:2013-03-22 01:49:16

标签: lucene lucene.net

假设我使用列表国家等标准进行搜索。用户可以选择要搜索的一组国家/地区,并将此组合与其他条件相结合。

在SQL中我会在我的where子句中执行此操作,即WHERE(country ='brazil'OR country ='france'OR country ='china)AND(其他搜索条件)。

目前尚不清楚如何在Lucene中这样做。 Query.combine似乎有希望,但如果我有多套“OR”条款可以解决,那么复杂性会很快增加。

Lucene在这方面是否有能力?或者我应该使用这些类型的标准点击我的常规数据库并过滤我的Lucene结果?

深入挖掘,看起来您可以嵌套布尔查询来完成此任务。如果这种技术有效并且性能良好,我会更新答案。

2 个答案:

答案 0 :(得分:5)

使用标准查询解析器(您可以查看relevant documentation),您可以使用类似于DB查询的语法,例如:

 (country:brazil OR country:france OR country:china) AND (other search criteria)

或者,为了简化一点:

 country:(brazil OR france OR china) AND (other search criteria)

或者,Lucene还支持使用+/-而不是AND / OR语法编写的查询。我发现Lucene查询的语法更具表现力。这种形式的等价物是:

 +country:(brazil france china) +(other search criteria)

如果手动构建查询,您确实可以嵌套BooleanQueries来创建类似的结构,使用正确的BooleanClauses来建立您指定的And / Or逻辑:

Query countryQuery = new BooleanQuery();
countryQuery.add(new TermQuery(new Term("country","brazil")),BooleanClause.Occur.SHOULD);
countryQuery.add(new TermQuery(new Term("country","france")),BooleanClause.Occur.SHOULD);
countryQuery.add(new TermQuery(new Term("country","china")),BooleanClause.Occur.SHOULD);

Query otherStuffQuery = //Set up the other query here, 
//or get it from a query parser, or something

Query rootQuery = new BooleanQuery();
rootQuery.add(countryQuery, BooleanClause.Occur.MUST);
rootQuery.add(otherStuffQuery, BooleanClause.Occur.MUST);

答案 1 :(得分:1)

两种方式。

1)让Lucene制定查询。要完成此操作,请按以下格式发送查询字符串。

查询:“country(巴西法国中国)”

内置的QueryParser使用OR运算符将上述字符串解析为BooleanQuery。

    QueryParser qp = new QueryParser(Version.LUCENE_41, "country", new StandardAnalyzer(Version.LUCENE_41));
    Query q = qp.parse(s);

2)如果您想自己制定查询,

  BooleanQuery bq = new BooleanQuery();
  //
  TermQuery tq = new TermQuery(new Term("country", "brazil"));
  bq.add(tq, Occur.SHOULD); // SHOULD ==> OR operator
  //
  tq = new TermQuery(new Term("country", "france"));
  bq.add(tq, Occur.SHOULD);
  // 
  tq = new TermQuery(new Term("country", "china"));
  bq.add(tq, Occur.SHOULD);

除非您添加数百个子查询,否则Lucene将在性能方面满足您的期望。