Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有'的字段;索引nullas';不包括在结果集中_Java_Spring Boot_Lucene_Hibernate Search - Fatal编程技术网

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
你在这里说的是:

  • validityRule.validFrom
    必须低于00000 20190601
  • validityRule.validTo
    必须高于00000 20190701
  • 或者,
    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
)