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

问题描述 投票:0回答:1

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

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地址而其他人没有时。我开始考虑这是一个合乎逻辑的问题,因为我正在调查一个列表,但是如果您对我做错的事情有任何了解,请告诉我。

lucene full-text-search hibernate-search
1个回答
0
投票

如果您为文档中的地址列表建立了索引,并且希望将条件应用于这些地址中的每一个,而不是将它们应用于合并在一起的所有地址,则需要将每个对象作为嵌套文档建立索引,然后使用“嵌套”谓词。

© www.soinside.com 2019 - 2024. All rights reserved.