如何排除集合中具有(或不具有)特定值的结果?

How to exclude results having (or not) a specific value in a collection?

假设我有一个或多或少像这样的实体(伪代码):

class Contact {
   String name;
   String surname;
   List<Address> addresses;
}

class Address {
   String streetName;
   String type;
}
* let's say every field is correctly annotated with @Field / @Indexed / @Embeddable etc

使用 jpa hibernate-search 我可以使用全文查询和模糊查询正确获取每个联系人,但我找不到将搜索限制为仅限于 name or surname or (addresses.streetName but only if addresses.type="XYZ")。当街道名称不是 xyz 类型时,我不希望它搜索街道名称。

org.apache.lucene.search.Query baseQuery = qb
                .keyword()
                .fuzzy()
                .onFields("name", "surname")
                .matching(String.join("+", queryStrings))
                .createQuery();


org.apache.lucene.search.Query addressQueryRestriction = qb.keyword()
                .onField("addresses.type")
                .matching("XYZ")
                .createQuery();

org.apache.lucene.search.Query addressQuery = qb.fuzzy()
                .onFields("addresses.streetName")
                .matching(String.join("+", queryStrings))
                .createQuery();

org.apache.lucene.search.Query queryAddressComposite = qb
                .bool()
                    .must(addressQuery)
                    .must(addressQueryRestriction)
                .createQuery();

org.apache.lucene.search.Query finalQuery = qb
                .bool()
                    .should(baseQuery)
                    .should(queryAddressComposite)
                .createQuery();

我一直在尝试使用 .bool().must() / should() / must().not() 组合替代查询,但没有取得太大成功。特别是当联系人有 XYZ 地址但其他人没有时。 我开始认为这是一个合乎逻辑的问题,因为我正在查看一个列表,但如果你知道我做错了什么,请批评我。

如果您在文档中对地址列表进行索引嵌入,并希望对每个地址应用条件,而不是将所有地址合并在一起,则需要将每个对象作为嵌套文档进行索引,然后使用 "nested" 谓词。

嵌套文档的概念存在于 Hibernate Search 6(仍处于 Beta 阶段)中,但不存在于 Hibernate Search 5 中。

我建议你升级。

有关详细信息,请参阅 this section of the Hibernate Search 6 documentation