2011-12-16 2 views
0

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

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

ответ

1

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

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

+0

О, я вижу, я наблюдал за этим конкретным вариантом сортировки (вы хотели сказать, что FacetSortOrder.FIELDVALUE, я думаю). Относительно 1-й части вашего комментария: Моя проблема заключается не в сочетании критериев в одном запросе, а в получении объектов, которые я хочу. Все возвращенные строки соответствуют критериям, но я хотел бы получить соответствующие страны, а не города, чья страна соответствует «Испания». Я уточню вопрос. – rainer198

Смежные вопросы