Hibernate 搜索 - cconvert sql 到 lucene 查询
Hibernate search - cconvert sql to lucene query
我有以下 select 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');
我想将其转换为使用休眠搜索的查询,我尝试了以下查询,但它没有给我正确的结果,任何人都可以看到查询可能有什么问题吗?
@Entity
@Indexed
public class DataEntity {
@Id
private String id;
@Field
private String agreementNumber;
@Field
private String useType;
@Field
@DateBridge(resolution = Resolution.DAY)
private Date endDate;
@Field
private String rib;
@Field
private String iban;
}
org.apache.lucene.search.Query firstQuery = getQuery().bool()
.must(getQuery().bool()
.must(getQuery().keyword().onField("agreementNumber").matching(agreementNumber).createQuery())
.must(getQuery().keyword().onField("useType").matching(useType).createQuery())
.must(getQuery().range().onField("endDate").above(effectiveDate).createQuery()).createQuery())
.should(getQuery().bool()
.must(getQuery().keyword().onField("rib").matching(rib).createQuery())
.must(getQuery().keyword().onField("iban").matching(iban).createQuery()).createQuery())
.createQuery();
您在同一布尔查询中使用了 must
和 should
。这可能不会像你想象的那样。
要模拟布尔值 AND
,请使用仅包含 must
子句的布尔值查询。
要模拟布尔值 OR
,请使用仅包含 should
子句的布尔值查询。
此外,您正在使用 above
来比较日期,而您的 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();
在相关说明中,您可能还希望禁用对代表代码的字段的分析,例如 agreementNumber
、rib
等。否则,您最终可能会得到比预期更多的匹配项.或者,如果您需要某种程度的宽大处理,但不需要 full-blown 分析,您可以依赖 normalizers
:https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#section-normalizers
(对于阅读本文的任何其他人,“RIB”是法国银行帐户标识符,而不是一块肉)
我有以下 select 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');
我想将其转换为使用休眠搜索的查询,我尝试了以下查询,但它没有给我正确的结果,任何人都可以看到查询可能有什么问题吗?
@Entity
@Indexed
public class DataEntity {
@Id
private String id;
@Field
private String agreementNumber;
@Field
private String useType;
@Field
@DateBridge(resolution = Resolution.DAY)
private Date endDate;
@Field
private String rib;
@Field
private String iban;
}
org.apache.lucene.search.Query firstQuery = getQuery().bool()
.must(getQuery().bool()
.must(getQuery().keyword().onField("agreementNumber").matching(agreementNumber).createQuery())
.must(getQuery().keyword().onField("useType").matching(useType).createQuery())
.must(getQuery().range().onField("endDate").above(effectiveDate).createQuery()).createQuery())
.should(getQuery().bool()
.must(getQuery().keyword().onField("rib").matching(rib).createQuery())
.must(getQuery().keyword().onField("iban").matching(iban).createQuery()).createQuery())
.createQuery();
您在同一布尔查询中使用了 must
和 should
。这可能不会像你想象的那样。
要模拟布尔值 AND
,请使用仅包含 must
子句的布尔值查询。
要模拟布尔值 OR
,请使用仅包含 should
子句的布尔值查询。
此外,您正在使用 above
来比较日期,而您的 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();
在相关说明中,您可能还希望禁用对代表代码的字段的分析,例如 agreementNumber
、rib
等。否则,您最终可能会得到比预期更多的匹配项.或者,如果您需要某种程度的宽大处理,但不需要 full-blown 分析,您可以依赖 normalizers
:https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#section-normalizers
(对于阅读本文的任何其他人,“RIB”是法国银行帐户标识符,而不是一块肉)