Java Hibernate搜索-将sql转换为lucene查询
我有以下选择SQL查询Java Hibernate搜索-将sql转换为lucene查询,java,sql,lucene,hibernate-search,Java,Sql,Lucene,Hibernate Search,我有以下选择SQL查询 SELECT * FROM data_entity WHERE agreement_number='9999' AND use_type='xxxx' AND end_date IS NOT NULL AND end_date <= '2022-05-03'::date OR (rib='1111111' AND iban='22222222'); 您在同一布尔查询中使用了必须和应该。这可能不会像你认为的那样 要模拟布尔值和,请使用只包含must子句的布尔查询
SELECT * FROM data_entity WHERE
agreement_number='9999' AND use_type='xxxx' AND end_date IS NOT NULL AND end_date <= '2022-05-03'::date
OR (rib='1111111' AND iban='22222222');
您在同一布尔查询中使用了
必须
和应该
。这可能不会像你认为的那样
要模拟布尔值和
,请使用只包含must
子句的布尔查询。
要模拟布尔值或
,请使用只包含should
子句的布尔查询
此外,您正在使用上面的来比较日期,而您的SQL查询显然是在查找给定日期之前的日期
因此,尝试一下:
org.apache.lucene.search.Query firstQuery = getQuery().bool()
.should(getQuery().bool()
.must(getQuery().keyword().onField("agreementNumber").matching(agreementNumber).createQuery())
.must(getQuery().keyword().onField("useType").matching(useType).createQuery())
.must(getQuery().range().onField("endDate").below(effectiveDate).createQuery()).createQuery())
.should(getQuery().bool()
.must(getQuery().keyword().onField("rib").matching(rib).createQuery())
.must(getQuery().keyword().onField("iban").matching(iban).createQuery()).createQuery())
.createQuery();
在相关说明中,您可能还希望禁用对表示代码的字段的分析,例如协议编号
,肋骨
,等等。否则,您可能会得到比预期更多的匹配项。或者,如果您需要某种程度的宽大处理,但不需要全面的分析,您可以依赖规范化程序:
(对于阅读本文的其他人来说,“肋骨”是一个法国银行账户标识符,而不是一块肉)
org.apache.lucene.search.Query firstQuery = getQuery().bool()
.should(getQuery().bool()
.must(getQuery().keyword().onField("agreementNumber").matching(agreementNumber).createQuery())
.must(getQuery().keyword().onField("useType").matching(useType).createQuery())
.must(getQuery().range().onField("endDate").below(effectiveDate).createQuery()).createQuery())
.should(getQuery().bool()
.must(getQuery().keyword().onField("rib").matching(rib).createQuery())
.must(getQuery().keyword().onField("iban").matching(iban).createQuery()).createQuery())
.createQuery();