我正在尝试将一个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);发布于 2014-04-02 22:10:09
在我看来是合理的。
当您说A记录“应该”也与地址匹配时,您并不清楚您的意思。如果您的意思是所有结果都必须与地址匹配,那么应该在将该子查询添加到BooleanClause.Occur.MUST时更改发生参数。如果您的意思是希望在该字段上有一个匹配,并且您希望在顶部看到这些文档,但是任何与数字范围查询匹配的结果都是可接受的,那么您当前的查询是正确的。
https://stackoverflow.com/questions/22813486
复制相似问题