Lucene-“;及;一套「;或;条款

Lucene-“;及;一套「;或;条款,lucene,lucene.net,Lucene,Lucene.net,假设我有一个使用诸如国家列表之类的条件的搜索。用户可以选择一组要搜索的国家,并将此国家与其他标准结合起来 在SQL中,我会在where子句中这样做,即where(国家=‘巴西’或国家=‘法国’或国家=‘中国)和(其他搜索条件) 目前还不清楚如何在Lucene中做到这一点。Query.combine似乎很有前途,但如果我要处理多组“或”术语,那么复杂性会很快增加 Lucene在这方面有能力吗?或者我应该用这些类型的标准点击我的常规数据库并过滤我的Lucene结果吗 深入挖掘,您似乎可以嵌套布尔查询

假设我有一个使用诸如国家列表之类的条件的搜索。用户可以选择一组要搜索的国家,并将此国家与其他标准结合起来

在SQL中,我会在where子句中这样做,即where(国家=‘巴西’或国家=‘法国’或国家=‘中国)和(其他搜索条件)

目前还不清楚如何在Lucene中做到这一点。Query.combine似乎很有前途,但如果我要处理多组“或”术语,那么复杂性会很快增加

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

深入挖掘,您似乎可以嵌套布尔查询来实现这一点。如果这项技术有效,并且性能良好,我将用一个答案进行更新。

两种方法

1) 让Lucene公式化查询。为此,请按以下格式发送查询字符串

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

内置QueryParser使用OR运算符将上述字符串解析为布尔查询

    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将在性能方面满足您的期望。

两种方法

1) 让Lucene公式化查询。为此,请按以下格式发送查询字符串

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

内置QueryParser使用OR运算符将上述字符串解析为布尔查询

    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将在性能方面满足您的期望。

使用标准查询解析器(您可以查看),可以使用类似于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)

如果手动构造查询,您确实可以嵌套以创建类似的结构,使用正确的方法来建立您指定的和/或逻辑:

querycountryquery=newbooleanquery();
countryQuery.add(新术语query(新术语(“国家”、“巴西”)),BooleanClause.occure.SHOULD);
countryQuery.add(新术语query(新术语(“国家”、“法国”)),BooleanClause.occure.SHOULD);
countryQuery.add(新术语查询(新术语(“国家”、“中国”)),BooleanClause.occure.SHOULD);
Query otherStuffQuery=//在此处设置其他查询,
//或者从查询解析器或其他什么地方获取它
Query rootQuery=new BooleanQuery();
添加(countryQuery,BooleanClause.occurrent.MUST);
添加(otherStuffQuery,BooleanClause.Occurse.MUST);

使用标准查询解析器(您可以查看),可以使用类似于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)

如果手动构造查询,您确实可以嵌套以创建类似的结构,使用正确的方法来建立您指定的和/或逻辑:

querycountryquery=newbooleanquery();
countryQuery.add(新术语query(新术语(“国家”、“巴西”)),BooleanClause.occure.SHOULD);
countryQuery.add(新术语query(新术语(“国家”、“法国”)),BooleanClause.occure.SHOULD);
countryQuery.add(新术语查询(新术语(“国家”、“中国”)),BooleanClause.occure.SHOULD);
Query otherStuffQuery=//在此处设置其他查询,
//或者从查询解析器或其他什么地方获取它
Query rootQuery=new BooleanQuery();
添加(countryQuery,BooleanClause.occurrent.MUST);
添加(otherStuffQuery,BooleanClause.Occurse.MUST);

感谢您的详细回复,非常棒的分组文档链接。谢谢!这真的帮了大忙。感谢您的详细回复,很好的分组文档链接。谢谢!这真的帮了大忙。我发现你完全正确-Lucene即使在复杂的嵌套查询中也非常快。我发现你完全正确-Lucene即使在复杂的嵌套查询中也非常快。