为Lucene创建最佳查询

时间:2018-08-27 10:24:51

标签: java lucene

嘿,我正在尝试创建一些查询,这些查询应类似于“ where ..... 和....和“在sql中。 我为此目的尝试过boolQuery;

boolQueryBuilder.add(new BooleanClause(new FuzzyQuery(new Term(fieldCity, 
city), 0), Occur.FILTER)); 
boolQueryBuilder.add(new BooleanClause(new WildcardQuery(new Term(fieldText, 
str)), Occur.SHOULD)); 
boolQueryBuilder.add(new FuzzyQuery(new Term(fieldText, strTemp), fuzzy), 
Occur.SHOULD); 
boolQueryBuilder.add(new FuzzyQuery(new Term(fieldText, mergedKeyword), 
fuzzy), Occur.SHOULD); 

这些是我的查询生成器builders元素之一。但是问题在于 不能像“ AND”操作“ FILTER”或“ MUST”那样返回所有值 当“ SHOULD”查询与任何结果都不匹配时的给定字段。

我希望返回速度,所以我希望每次搜索的结果更少。 有人可以给我有关我的问题的建议。

做得好。

1 个答案:

答案 0 :(得分:1)

如果我的理解正确,那么问题在于您将通过fieldCity返回所有具有匹配项的结果,无论是否在fieldText上具有匹配项,并且希望所有结果在fieldText上至少具有一个匹配项。 / p>

您现在拥有的基本上是:+city text1 text2 text3。要匹配的唯一术语是城市。其余学期将影响分数,但不会限制结果集。如果要确保至少有一个fieldText匹配项,可以将查询更改为如下所示:+city +(text1 text2 text3)

BooleanQuery fieldTextSubQuery = new BooleanQuery.Builder()
    .add(new WildcardQuery(new Term(fieldText, str), Occur.SHOULD)
    .add(new FuzzyQuery(new Term(fieldText, strTemp), fuzzy), Occur.SHOULD)
    .add(new FuzzyQuery(new Term(fieldText, mergedKeyword), fuzzy), Occur.SHOULD)
    .build();

BooleanQuery finalQuery = new BooleanQuery.Builder()
    .add(new FuzzyQuery(new Term(fieldCity, city), 0), Occur.FILTER)
    .add(textSubQuery, Occur.MUST)
    .build();