如何排除集合中具有(或不具有)特定值的结果?
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。
假设我有一个或多或少像这样的实体(伪代码):
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。