Мне нравится использовать Hibernate Search для реализации сложной функции автозапусков в нескольких полях ввода на веб-странице. Каждое поле ввода предназначено для его собственного объекта, допустим, Country
и City
. Между обеими организациями существует много-однозначная связь (страны содержат города).Hibernate Search: как запросить встроенные объекты
Автосущество должно работать так, чтобы при вводе текста, например, префикс названия страны и поле города уже заполнены, вы получаете только предложения для стран с таким городом (и наоборот).
Служба автозавершения на стороне сервера должна возвращать список прогнозов (entityId, entityName), которые отображаются в поле ввода (выпадающее меню, независимо).
Согласно схеме и после прочтения инструкции я попытался следующая схема: указательного
SearchMapping mapping = new SearchMapping();
mapping.analyzerDef(...
.entity(City.class).indexed().indexName("MyIndex")
.property("cityId", ElementType.FIELD)
.documentId()
.name("id")
.property("name", ElementType.FIELD)
.documentId()
.name("id")
.property("country", ElementType.METHOD)
.indexEmbedded()
.entity(Country.class).indexed()
.property("id", ElementType.FIELD)
.documentId()
.name("id")
.property("name", ElementType.METHOD)
.field()
.name("name")
Это отображение определяет City
быть основным органом, не так ли?
Я проиндексировал все города и могу запросить их (также путем объединения обоих полей). Тем не менее, я получаю только матчи при запросах для городов. т. Е. При запросе типа fullTextSession.getSearchFactory(). BuildQueryBuilder(). ForEntity (City.class) .get();
Это поле полезно для поля страны, потому что, когда я печатаю «Испания», я получаю один ряд для каждого города Испании. (Испания, Испания, Испания, Испания, .... ;-))
Вопрос: Как можно искать сущности страны? Изменение структуры индекса? Процедура индексации? Или как запросить?
Единственный способ, который я нашел, это установить фасет для country
, и вы можете использовать различные грани в качестве автосущности. Тем не менее, это также не идеально , так как сортировать грани в алфавитном порядке невозможно.
Конечно, в этом примере я мог бы переключать оба объекта в сопоставлении, но предположил бы сценарии с более сложными графами сущностей.
UPDATE: добавление запросов запрошенных в комментариях
Для построения запросов, я использую в QueryBuilder. Далее производит набор результатов, как в примере Испании:
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get();
с запросом:
country.name:Spain
Если я пытаюсь использовать построитель запросов для стран
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get();
и запросов:
name:Spain
Я не получаю никаких результатов.
О, я вижу, я наблюдал за этим конкретным вариантом сортировки (вы хотели сказать, что FacetSortOrder.FIELDVALUE, я думаю). Относительно 1-й части вашего комментария: Моя проблема заключается не в сочетании критериев в одном запросе, а в получении объектов, которые я хочу. Все возвращенные строки соответствуют критериям, но я хотел бы получить соответствующие страны, а не города, чья страна соответствует «Испания». Я уточню вопрос. – rainer198