2012-06-05 3 views
1
@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; 
} 

Мой испытующе коды:Hibernate Search @IndexedEmbedded не индексировать

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» и «описание» есть результаты, но тип один соответствующий». name "или" catalogs.name "не имеет результатов

Является ли объект AppType не индексирующим?

+0

Вам также нужно добавить аннотацию @Indexed в AppType. – gmansoor

ответ

2

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

+0

Большое спасибо. Я научусь использовать Люка для проверки. Я нахожу, что «Доступные поля» содержит type.id, catalogs.id, но не содержит type.name, catalogs.name. –

+0

Вы уверены, что поля имени не _null_. Если индекс содержит _type.id_ и _catalogs.id_, встроенная индексация, похоже, срабатывает. Возможно, это поможет, если вы добавите код, который вы используете для индексирования. Вы также можете включить отладочную или трассировку протоколов. Затем вы должны увидеть, какие данные индексируются. – Hardy

+0

Данные были сохранены в базе данных. Я могу получить их следующим образом: {«id»: 150, «district»: 1, «appName»: «appName», «thumbnail»: «thumbnail», «статистика»: null, «description»: «description», "издатель": 1, "publishAt": 1339472381703, "тип": { "ID": 1, "имя": "веб"}, "каталоги": [{ "ID": 1, "имя": "城市规划 " "родитель": - 1}, { "идентификатор": 2, "название": "城市 建设", "родитель": - 1}], "статус": 1, "состояние": 1," isPopular ": 1} –

0

Добавить примечание @Indexed в классе AppType.