假设我有一个或多或少像这样的实体(伪代码):
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类型时,我不希望它搜索streetNames。
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地址而其他人没有时。我开始考虑这是一个合乎逻辑的问题,因为我正在调查一个列表,但是如果您对我做错的事情有任何了解,请告诉我。
如果您为文档中的地址列表建立了索引,并且希望将条件应用于这些地址中的每一个,而不是将它们应用于合并在一起的所有地址,则需要将每个对象作为嵌套文档建立索引,然后使用“嵌套”谓词。