Java 正确使用Lucene BooleanQuery?

Java 正确使用Lucene BooleanQuery?,java,lucene,Java,Lucene,我试图将一个布尔查询嵌套在另一个布尔查询中 内部布尔查询是使用以下代码创建的,并添加到topBQuery中 BooleanQuery topBQuery = new BooleanQuery(); // add a numeric range query on loan amount. if( row.getLoan_amt() > 0 ){ BooleanQuery loanBQuery = new 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字段中创建的范围相匹配的文档。记录还应与提供的地址匹配。我是否正确创建布尔查询

还有更好的方法来进行这种搜索吗

我用的是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);

在我看来很合理


当你说记录“应该”也与地址匹配时,你并不清楚你的意思。如果您的意思是所有结果都必须与地址匹配,那么在将该子查询添加到
BooleanClause.occure.Must
时,您应该更改occure参数。如果您的意思是希望在该字段上有一个匹配项,并且希望在顶部看到这些文档,但是任何与数字范围查询匹配的结果都是可接受的,那么您当前的查询是正确的。

需要首先匹配一个数字范围,然后再匹配一个地址。这说明了吗?不管怎样,你都是说这个查询看起来不错。我缺少结果可能表明数据不在我的索引中。@Cuthbert,我建议您在出现时添加上一个术语查询。MUST@Cuthbert-是的,正如我所说,如果地址必须匹配,
BooleanClause.occurrent.must
是正确的参数。我不知道你没有得到任何结果。使用BooleanQueries并没有什么固有的错误,更改
occurrent
值肯定不会导致获得更多结果。我怀疑您对字段进行索引的方式会导致没有结果。您是否使用
双字段
为贷款金额字段编制索引?字段名是否正确(区分大小写!)?是否分析了地址?它们用
IntField
索引。我意识到这可能是个问题,所以我正在将双精度转换为整数。为什么不使用
numerichangequery.newIntRange