допустим, у меня есть объект, более или менее похожий на этот (псевдокод):
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")
. Я не хочу, чтобы он выполнял поиск в streetNames, когда они не относятся к типу 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 () / must () / must (). not (), но без особого успеха. Особенно, когда у контакта есть адрес XYZ, но есть и другие, которых нет. Я начинаю осознавать, что это логичная проблема, поскольку я просматриваю список, но если у вас есть какие-либо представления о том, что я делаю не так, пожалуйста, блин, пожалуйста.