0

假设我使用列表国家等条件进行搜索。用户可以选择一组国家进行搜索,并将该组与其他标准结合起来。

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

目前尚不清楚如何在 Lucene 中执行此操作。Query.combine 似乎有希望,但如果我有多组“OR”术语要处理,复杂性会很快增加。

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

深入挖掘,您似乎可以嵌套布尔查询来完成此操作。如果这种技术有效并且它是否有效,我会更新答案。

4

2 回答 2

6

使用标准查询解析器(您可以查看相关文档),您可以使用类似于 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);
于 2013-03-22T16:35:02.380 回答
1

两种方式。

  1. 让 Lucene 制定查询。为此,请按以下格式发送查询字符串。

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

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

QueryParser qp = new QueryParser(Version.LUCENE_41, "country", new StandardAnalyzer(Version.LUCENE_41));
Query q = qp.parse(s);
  1. 如果您想自己制定查询,
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 将在性能方面满足您的期望。

于 2013-03-22T02:44:38.100 回答