我正在尝试将一个BooleanQuery嵌套在另一个内部。
使用以下代码创建内部BooleanQuery并将其添加到topBQuery。
BooleanQuery topBQuery = new BooleanQuery();
// add a numeric range query on loan amount.
if( row.getLoan_amt() > 0 ){
BooleanQuery loanBQuery = new BooleanQuery();
Double loanMin = 0.0;
Double loanMax = 0.0;
Double loanAmt = row.getLoan_amt();
// Range should be within +- 5% of loan amount.
loanMin = loanAmt - (loanAmt * .05);
loanMax = loanAmt + (loanAmt * .05);
loanBQuery.add(NumericRangeQuery.newDoubleRange(TitleRecordColumns.SR_LOAN_VAL_1.toString(), loanMin, loanMax, true, true), BooleanClause.Occur.SHOULD);
loanBQuery.add(NumericRangeQuery.newDoubleRange(TitleRecordColumns.SR_LOAN_VAL_2.toString(), loanMin, loanMax, true, true), BooleanClause.Occur.SHOULD);
loanBQuery.add(NumericRangeQuery.newDoubleRange(TitleRecordColumns.SR_LOAN_VAL_3.toString(), loanMin, loanMax, true, true), BooleanClause.Occur.SHOULD);
topBQuery.add(loanBQuery, BooleanClause.Occur.MUST);
}
使用以下内容将另一个字段添加到topBQuery:
if( !row.getPropertykey_tx().isEmpty() ){
//TitleRecordColumns is an enum
topBQuery.add(new TermQuery(new Term(TitleRecordColumns.SA_SITE_ADDR.toString(), row.getPropertykey_tx())), BooleanClause.Occur.SHOULD);
}
我只想要与我在任何SR_LOAN_VAL字段中创建的范围匹配的文档。记录也应与提供的地址相匹配。我是否正确创建了BooleanQuery?
还有更好的方法来进行此类搜索吗?
我正在使用Lucene 4.7。我用Luke查看了我的索引,我确信我已经正确地索引了这些字段。谢谢!
编辑:
这是我用来生成“最终查询”的代码,我用它来搜索索引。我见过的大多数例子都是这样的。它是否正确?
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
Query finalQuery = new QueryParser(Version.LUCENE_47, TitleRecordColumns.SA_SITE_ADDR.toString(), analyzer).parse(topBQuery.toString());
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs results = searcher.search(finalQuery, 5);
答案 0 :(得分:1)
对我来说看起来很合理。
如果您说A记录“should”也与地址匹配,则不清楚您的意思。如果您的意思是所有结果必须与地址匹配,则应在将该子查询添加到BooleanClause.Occur.MUST
时更改Occur参数。如果您的意思是首选匹配该字段,并且您希望在顶部看到这些文档,但是与数字范围查询匹配的任何内容都是可接受的结果,那么您当前的查询是正确的。