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();

您在同一布尔查询中使用了 mustshould。这可能不会像你想象的那样。

要模拟布尔值 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();

在相关说明中,您可能还希望禁用对代表代码的字段的分析,例如 agreementNumberrib 等。否则,您最终可能会得到比预期更多的匹配项.或者,如果您需要某种程度的宽大处理,但不需要 full-blown 分析,您可以依赖 normalizershttps://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#section-normalizers

(对于阅读本文的任何其他人,“RIB”是法国银行帐户标识符,而不是一块肉)