Java 带有'的字段;索引nullas';不包括在结果集中
我试图在数据库中为空的属性上使用Java 带有'的字段;索引nullas';不包括在结果集中,java,spring-boot,lucene,hibernate-search,Java,Spring Boot,Lucene,Hibernate Search,我试图在数据库中为空的属性上使用@IndexedEmbedded的indexNullAs属性: ... @Indexed public class DocVersion implements Serializable { ... @IndexedEmbedded(indexNullAs = "valid") @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "rule
@IndexedEmbedded
的indexNullAs
属性:
...
@Indexed
public class DocVersion implements Serializable {
...
@IndexedEmbedded(indexNullAs = "valid")
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "rule_id")
private ValidityRule validityRule;
...
}
在db中,我有两条记录,一条记录与该记录关联validityRule
,另一条记录为null
这是我为hibernate搜索构建的查询的一部分:
FullTextQueryImpl(-(+document2.docType.documentType:FOLDER) +(+document2.eDocState:ACTIVE) +(document2.docType.documentType:ACCOUNTSTATEMENT) +(+validityRule.validFrom:[* TO 0000020190601] +validityRule.validTo:[0000020190701 TO *] validityRule:valid))
这只返回一条记录,即与validityRule
关联并符合日期标准的记录
我的问题是它不会返回没有设置validityRule的第二行。
我理解这个indexNullAs
,因为当未设置db字段时,它应该成为“有效”字符串。您可以在查询中看到它吗
那么为什么我没有得到结果集中的第二行呢?我做错了什么?
我已经从dist中删除了所有索引,程序正在每次运行时重新为记录编制索引
hibernate搜索orm:5.10.4.4最终版本
感谢您的解释。问题在于查询的这一部分:
+validityRule.validFrom:[* TO 0000020190601] +validityRule.validTo:[0000020190701 TO *] validityRule:valid
你在这里说的是:
必须低于00000 20190601validityRule.validFrom
必须高于00000 20190701validityRule.validTo
- 或者,
应等于validityRule
,在这种情况下,文档的分数应略高valid
(
validityRule.validFrom:[* TO 0000020190601]
AND validityRule.validTo:[0000020190701 TO *]
)
“应该”子句没有出现在其中,因为它是可选的。它不影响匹配,只影响分数
这里重要的是,“必须”/“应该”并不直接等同于布尔运算符“和”/“或”:它们有自己的含义。
根据经验,如果要在全文查询中实现“AND”/“OR”:
- 对于“AND”,使用只包含“MUST”子句的布尔查询
- 对于“OR”,使用只包含“SHOULD”子句的布尔查询
- 根据需要嵌套布尔查询以组合“AND”和“OR”。将布尔查询视为传统布尔表达式中的括号:它们防止“AND”运算符与“OR”运算符混淆
- 除非您知道自己在做什么,否则不要在同一布尔查询中混合使用“必须”和“应该”
( // 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
)