Hibernate Search @IndexedEmbedded не индексирует

@Entity
@Indexed
@SequenceGenerator(name="subjectSeq", sequenceName="subjectSeq")
public class AppInfo {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="subjectSeq")
    public Integer id;

    public Integer district;

    @Field
    @Boost(2.0f)
    public String appName;

    public String thumbnail;

    public Integer statistics;

    @Field
    public String description;

    public Integer publisher;

    public Date publishAt = new Date();

    @ManyToOne
    @IndexedEmbedded
    @Boost(1.5f)
    @JoinColumn(name="type")
    public AppType type;

    @ManyToMany
    @JoinTable(name="appInfo_appCatalog",
    joinColumns={@JoinColumn(name="info_id", referencedColumnName="id")},
    inverseJoinColumns={@JoinColumn(name="catalog_id", referencedColumnName="id")})
    @IndexedEmbedded
    @Boost(1.5f)
    public List<AppCatalog> catalogs;
}

@Entity
@SequenceGenerator(name="appTypeSeq", sequenceName="appTypeSeq")
public class AppType {

    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="appTypeSeq")
    public Integer id;

    @Field
    public String name;
}

Мой код поиска:

QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity( AppInfo.class ).get();
org.apache.lucene.search.Query query = qb
              .keyword().fuzzy()
              .onFields("appName", "description", "type.name", "catalogs.name")
              .matching(searchString)
              .createQuery();

Вопрос заключается в том, что поля «searchString», соответствующие полям «appName» и «description», имеют результаты, но те, которые соответствуют полям «type.name» или «catalogs.name», не имеют результатов.

Объект AppType не индексируется?


person 慧 储    schedule 05.06.2012    source источник
comment
Вам также необходимо добавить аннотацию @Indexed в AppType.   -  person gmansoor    schedule 04.12.2014


Ответы (2)


Пока код выглядит нормально, и, поскольку вы используете @IndexedEmbedded, AppType также должен быть проиндексирован. Как вы думаете, почему это не так? Вы проверили индекс Lucene с Люком, чтобы проверить содержание? Таким образом, вы можете убедиться, что type.name находится в индексе, а также увидеть, какие токены проиндексированы. Часто бывают проблемы и с анализаторами. В зависимости от анализатора, который вы используете, доступные для поиска токены в индексе могут отличаться от ожидаемых.

person Hardy    schedule 07.06.2012
comment
Большое спасибо. Я учусь использовать Люка для проверки. Я обнаружил, что Доступные поля содержат type.id, catalogs.id, но не содержат type.name, catalogs.name. - person 慧 储; 09.06.2012
comment
Вы уверены, что поля имени не являются пустыми. Если индекс содержит type.id и catalogs.id, кажется, что встроенная индексация активирована. Возможно, это поможет, если вы добавите код, который используете для индексации. Вы также можете включить ведение журнала отладки или трассировки. Затем вы должны увидеть, какие данные индексируются - person Hardy; 11.06.2012
comment
Данные хранились в базе данных. Я могу получить их следующим образом: {id:150,district:1,appName:appName,thumbnail:thumbnail,statistics:null,description:description,publisher:1,publishAt:1339472381703,type:{id:1,name:web },каталоги:[{id:1,имя:城市规划,родительский:-1},{id:2,имя:城市建设,родительский:-1}],статус:1,состояние:1,популярно:1} - person 慧 储; 12.06.2012
comment
Как отследить ведение журнала? Есть ли какой-либо элемент конфигурации для входа в файл persistence.xml? - person 慧 储; 12.06.2012
comment
Хм, кажется, ваши имена содержат китайские (!?) иероглифы. Если да, то я бы обязательно проверил, какие токены выдаёт ваш анализатор. Какой анализатор вы используете для полей имени? - person Hardy; 12.06.2012
comment
Что касается ведения журнала, это зависит от того, где и как вы используете Поиск. Поиск использует slf4j в качестве фреймворка ведения журналов. Вам необходимо добавить привязку slf4j для конкретной среды ведения журнала (log4j, ведение журнала java, ...) и добавить правильный файл конфигурации ведения журнала, например, log4j.properties. - person Hardy; 12.06.2012
comment
Привет Харди, я нашел причину. Индекс обновляется, когда вставка (или обновление) JPA происходит автоматически. Когда я добавляю новый объект: curl --data {\district\:1, \appName\:\appName\,\thumbnail\:\thumbnail\, \description \:\описание\ ,\издатель\:1, \тип\:**{\id\:1}**, \каталоги\:[{\id\:1},{\ id\:2}], \status\:1, \state\:1, \isPopular\:1} localhost :9000/app/save , я не присваиваю значение type.name или catalogs.name. Хотя JPA может работать хорошо, поиску нужны полные значения для каждого поля внутреннего объекта. Спасибо большое за вашу помощь. - person 慧 储; 14.06.2012
comment
Ваш ответ полезен для меня. Боюсь, я небрежно нажал противоположную кнопку для вашего отзыва. - person 慧 储; 14.06.2012

Добавьте аннотацию @Indexed в класс AppType.

person gmansoor    schedule 04.12.2014