假设我使用列表国家等标准进行搜索。用户可以选择要搜索的一组国家/地区,并将此组合与其他条件相结合。
在SQL中我会在我的where子句中执行此操作,即WHERE(country ='brazil'OR country ='france'OR country ='china)AND(其他搜索条件)。
目前尚不清楚如何在Lucene中这样做。 Query.combine似乎有希望,但如果我有多套“OR”条款可以解决,那么复杂性会很快增加。
Lucene在这方面是否有能力?或者我应该使用这些类型的标准点击我的常规数据库并过滤我的Lucene结果?
深入挖掘,看起来您可以嵌套布尔查询来完成此任务。如果这种技术有效并且性能良好,我会更新答案。
答案 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将在性能方面满足您的期望。