2015-11-05 4 views
0

Я пытаюсь интегрировать Hibernate Search в приложение. Сущности приложения могут иметь несколько свойств, которые хранятся на многоязычном языке. Это достигается путем разделения неязыковых и многоязычных свойств на отдельные объекты. Пример фрагмент этого раскола выглядит следующим образом (пропущено в спящем режиме аннотаций, как часть базы данных работает нормально):Hibernate-Search @IndexedEmbedded с HashMap, как включить набор ключей в индекс

@Indexed 
public class Assignment { 

    @DocumentId 
    private UUID id; 

    @IndexedEmbedded 
    private Map<String, AssignmentI18n> i18n; 

    // Other properties 
} 

public class AssignmentI18n { 

    @DocumentId 
    @FieldBridge(impl = AssignmentI18nBridge.class) 
    private AssignmentI18nId id; 

    @Field 
    private String title; 

    @Field 
    private String description; 

    @Field 
    private String requirements; 

    public static class AssignmentI18nId { 

     private UUID assignmentId; 

     private String iso; 
    } 
} 

Теперь я хотел бы сделать эти данные для поиска, используя Hibernate Search, рассматривая его как единое целое в индекс. Способ настройки аннотаций происходит, однако все записи многоязычных полей хранятся в том же поле в индексе. Основном мой указательный структура выглядит следующим образом:

id 
i18n.title 
i18n.description 
i18n.requirements 

Поскольку все значения многоязычных данных индексируется в том же поле, я уже не могу различить, какой язык они принадлежат. Есть ли способ, чтобы сделать индекс выглядеть следующим образом ?:

id 
i18n.nl.title 
i18n.en.title 
i18n.nl.description 
i18n.en.description 
i18n.nl.requirements 
i18n.en.requirements 

Основном Я хотел бы добавить ключевое значение HashMap с именем индекс поля. Я рассмотрел возможность рассмотрения карты как поля с пользовательским полем FieldBridge, но это не похоже на правильный подход.

ответ

0

Если вы хотите, чтобы индексированные поля выглядели так, как вы описываете, используйте настраиваемый мост полей. Вот как вы можете получить эту структуру, но поскольку ваше значение карты довольно сложно, для создания всех полей потребуется довольно много настраиваемого кода.

Вы можете создать запрос функции для поиска в спящем режиме here. Я мог представить, что этот тип функции будет носить общий характер. В основном способ либо с помощью опции @IndexedEmbedded, либо с помощью дополнительной аннотации определить, как ключ карты становится частью имени поля Lucene. Тем не менее, вы подумали о том, как именно вы могли бы искать в этом индексе? Является ли пользователь каким-то образом указывать локаль и в зависимости от этого локали вы будете нацелены на соответствующие поля? Кроме того, как вы относитесь к своему подходу к настройке различных стволовых клеток в зависимости от типа языка?

+0

Я предполагаю, что это FieldBridge. Я не думаю, что структура карты слишком сложна, хотя все значения будут иметь тип String, иначе нет причин для их участия в многоязычном объекте. Я предполагаю, что могу создать пользовательскую аннотацию, чтобы узнать, какие поля добавить в индекс. Что касается других вопросов, я в настоящее время делаю это один шаг за один раз, и мой первый шаг - создать подходящий индекс. На данный момент это нужно только для поиска по одному языку за раз. Такие параметры, как стебель и другие фильтры, должны быть изучены. –