Мне нравится использовать Hibernate Search для реализации сложной функции автозаполнения в нескольких полях ввода на веб-странице.Каждое поле ввода предназначено для отдельной сущности, скажем, Country
и City
.Между обеими организациями существует взаимосвязь «многие-к-одному» (страны содержат города).
Автозаполнение должно работать таким образом, чтобы при наборе, например, префикса названия страны и поля города уже было заполнено, вы получаете только предложения для стран, в которых есть такой город (и наоборот).
Служба автозаполнения на стороне сервера должна возвращать список проекций (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
как основной объект, верно?
Iиндексируют все города и могут запрашивать их (также объединяя оба поля).Тем не менее, я получаю совпадения только при запросе городов.т. е. при запросах наподобие fullTextSession.getSearchFactory (). buildQueryBuilder (). forEntity (City.class) .get ();
Это не полезно для поля страны, потому что, когда я набираю «Испания», я получаюодин ряд для каждого города Испании.(Испания, Испания, Испания, Испания, ....; -))
Вопрос : как можно искать объекты страны?Изменение структуры индекса?Процедура индексации?Или как сделать запрос?
Единственный способ, который я нашел, - это установить фасет для country
, и вы можете использовать различные возможные фасеты в качестве автозаполнения.Однако это также не идеально, поскольку невозможно отсортировать фасеты по алфавиту.
Конечно, в этом примере я мог бы переключать обе сущности в отображении, но допустим сценарии с более сложными графами сущностей.
ОБНОВЛЕНИЕ: добавление запросов, запрошенных в комментарии
Для построения запросов я использую QueryBuilder.Следующее создает набор результатов, как в примере с Испанией:
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get();
с запросом:
country.name:Spain
Если я пытаюсь использовать построитель запросов для стран
fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get();
и запрос:
name:Spain
Я не получил результатов.