Как исключить результаты, имеющие (или нет) заданное значение c в коллекции? - PullRequest
0 голосов
/ 04 февраля 2020

допустим, у меня есть объект, более или менее похожий на этот (псевдокод):

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, но есть и другие, которых нет. Я начинаю осознавать, что это логичная проблема, поскольку я просматриваю список, но если у вас есть какие-либо представления о том, что я делаю не так, пожалуйста, блин, пожалуйста.

1 Ответ

0 голосов
/ 04 февраля 2020

Если вы проиндексировали и внедрили список адресов в свой документ и хотите применить условия к каждому из этих адресов, а не ко всем слитым вместе, вам нужно проиндексировать каждый объект как вложенный документ, а затем использовать «вложенный» предикат.

Концепция вложенных документов существует в Hibernate Search 6 (все еще в бета-версии), но отсутствует в Hibernate Search 5.

Я бы порекомендовал вам обновить.

Подробнее см. в этом разделе документации Hibernate Search 6 .

...