'indexNullAs' 的字段未包含在结果集中

field with 'indexNullAs' not included in result set

我正在尝试在数据库中为空的 属性 上使用 @IndexedEmbeddedindexNullAs 属性:

...
@Indexed
public class DocVersion implements Serializable {
...
    @IndexedEmbedded(indexNullAs = "valid")
    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "rule_id")
    private ValidityRule validityRule;
...
}

在数据库中,我有两条记录,一条与记录相关联 validityRule,另一条为空。

这是我为休眠搜索构建的查询的一部分:

FullTextQueryImpl(-(+document2.docType.documentType:FOLDER) +(+document2.eDocState:ACTIVE) +(document2.docType.documentType:ACCOUNTSTATEMENT) +(+validityRule.validFrom:[* TO 0000020190601] +validityRule.validTo:[0000020190701 TO *] validityRule:valid))

这 return 只是一条记录,与 validityRule 关联并符合日期标准的一条记录。

我的问题是它不会 return 没有设置 validityRule 的第二行。 我理解这个 indexNullAs ,因为当没有设置数据库字段时它应该变成 'valid' 字符串。你可以在查询中看到它吗?

那么为什么我没有得到结果集中的第二行?我究竟做错了什么? 我已经从 dist 中删除了所有索引,程序正在为每个 运行.

上的记录重新编制索引

hibernate-search-orm: 5.10.4.Final

感谢您的解释。

问题出在查询的这一部分:

+validityRule.validFrom:[* TO 0000020190601] +validityRule.validTo:[0000020190701 TO *] validityRule:valid

你在这里说的是:

  • validityRule.validFrom 必须低于 0000020190601
  • validityRule.validTo 必须高于 0000020190701
  • 可选地,validityRule 应该等于 valid,在这种情况下文档的分数应该略高。

这大致转化为以下布尔表达式:

(
    validityRule.validFrom:[* TO 0000020190601]
    AND validityRule.validTo:[0000020190701 TO *]
)

"SHOULD" 子句没有出现在其中,因为它是可选的。不影响匹配,只影响得分。

这里重要的是 "MUST"/"SHOULD" 并不直接等同于布尔运算符 "AND"/OR":它们有自己的含义。 根据经验,如果要在全文查询中实现 "AND"/"OR":

  • 对于 "AND",使用仅包含 "MUST" 个子句的布尔查询。
  • 对于 "OR",使用仅包含 "SHOULD" 个子句的布尔查询。
  • 根据需要嵌套布尔查询以组合 "AND" 和 "OR"。将布尔查询视为传统布尔表达式中的括号:它们防止 "AND" 运算符与 "OR" 运算符混淆。
  • 切勿在同一布尔查询中混合使用 "MUST" 和 "SHOULD",除非您知道自己在做什么。

在您的情况下,您将需要两个级别的布尔查询:

( // parent boolean query implementing "OR"
  ( // First "SHOULD" clause: a boolean query implementing "AND"
    +validityRule.validFrom:[* TO 0000020190601] // "MUST" clause
    +validityRule.validTo:[0000020190701 TO *] // "MUST" clause
  )
  validityRule:valid // Second "SHOULD" clause
)