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