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

Lucene 如何排除集合中具有(或不具有)特定值的结果?,lucene,full-text-search,hibernate-search,Lucene,Full Text Search,Hibernate Search,假设我有一个或多或少像这样的实体(伪代码): 我一直在尝试使用.bool().must()/should()/must().not()编写替代查询,但没有太多成功。尤其是当联系人有XYZ地址,但其他联系人也有XYZ地址时。 我开始觉得这是一个合乎逻辑的问题,因为我正在查看一个列表,但是如果你知道我做错了什么,请告诉我。如果你在文档中嵌入一个地址列表,并希望对每个地址应用条件,而不是将所有地址合并在一起,您需要将每个对象作为嵌套文档进行索引,然后使用“嵌套”谓词 嵌套文档的概念存在于Hiberna

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

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

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

嵌套文档的概念存在于HibernateSearch6(仍在测试版中),但不存在于HibernateSearch5中

我建议您升级

有关更多信息,请参阅

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
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();