'indexNullAs' 的字段未包含在结果集中
field with 'indexNullAs' not included in result set
我正在尝试在数据库中为空的 属性 上使用 @IndexedEmbedded
的 indexNullAs
属性:
...
@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
)
我正在尝试在数据库中为空的 属性 上使用 @IndexedEmbedded
的 indexNullAs
属性:
...
@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
必须低于 0000020190601validityRule.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
)