Поиск в спящем режиме: как запросить встраиваемые объекты - PullRequest
0 голосов
/ 16 декабря 2011

Мне нравится использовать 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

Я не получил результатов.

1 Ответ

1 голос
/ 17 декабря 2011

Вы не показываете свой фактический запрос. Вам не нужно использовать DSL-запрос, но вы также можете писать собственные запросы Lucene. В обоих случаях (DSL или собственный Lucene) вы можете комбинировать запросы с помощью логической логики. Вложенные сущности следуют нотации Java-бина. Например, название страны в запросе города будет иметь вид country.name . Опять же, без вашего фактического запроса трудно дать более конкретную обратную связь.

И последнее, но не менее важное: фасеты можно сортировать по алфавиту. Проверьте FacetSortOrder.COUNT_DESC.

...