2016-06-10 1 views
0

Мне нужно выполнить программную конфигурацию полей для индексирования с помощью Hibernate Search.Программное сопоставление со встроенным индексом в Hibernate Результаты поиска не могут найти ошибку поля

В приведенном ниже сценарии использование indexEmbedded() приводит к ошибке «ошибка поля».

@Entity 
public class AT { 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "ARRM_IDE", nullable = false) 
    private A arr; 

    private Date dateType; 

    (and other fields) 
} 

@Entity 
public class A { 

    @Id 
    @SequenceGenerator(name = "C_SEQUENCE", sequenceName = "S_ARRM_01") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "C_SEQUENCE") 
    @Column(name = "IDE_ARR") 
    private Long id; 
} 

SearchMapping mapping = new SearchMapping(); 
mapping.entity(AT.class).indexed() 
     .property("dateType", ElementType.FIELD) 
     .field() 
     .store(Store.YES) 
     .property("arr", ElementType.FIELD) 
     .indexEmbedded() 
     .entity(A.class).indexed() 
     .property("id", ElementType.FIELD).documentId().name("arrId") 
     .field() 
     .store(Store.YES) 
     ; 

Когда я создаю и сохраняются сущности (я интегрировали Hibernate Search с Elasticsearch), субъекты создаются и индексы создаются в Elasticsearch также.

содержимое на Elasticsearch:

 "_index" : "com.....at", 
     "_type" : "com.....AT", 
     "_id" : "7744", 
     "_score" : 1.0, 
     "_source" : { 
     "dateType" : "2016-06-12T06:08:52.780Z", 
     "arr" : { 
      "id" : 6352 
     } 
     } 
    } ] 

Но когда я пытаюсь запроса с помощью запроса Hibernate Search Lucene это не удается:

FullTextEntityManager fullTextEntityManager = 
     org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 
QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
     .buildQueryBuilder().forEntity(AT.class).get(); 
org.apache.lucene.search.Query luceneQuery = qb.bool() 
     .must(qb 
       .range() 
       .onField("dateType") 
       .from(parseDate(startDate)) 
       .to(parseDate(endDate)).excludeLimit() 
       .createQuery()) 
     .must(qb 
     .keyword() 
     .onField("arr") 
     .matching(crsArrId).createQuery()) 
     .createQuery(); 
Sort sort = null; 
if (order == OrderEnum.ASCENDING) { 
    sort = new Sort(
      new SortField("dateType", SortField.Type.STRING)); 
} else { 
    sort = new Sort(
      new SortField("dateType", SortField.Type.STRING, true)); 
} 
FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, AT.class); 
jpaQuery.setSort(sort); 
jpaQuery.setFirstResult(offset); 
jpaQuery.setMaxResults(maxReturnedEvents); 

return jpaQuery.getResultList(); 

Ошибка:

org.hibernate.search.exception.SearchException: Unable to find field arr in com....AT 
    at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.objectToString(DocumentBuilderIndexedEntity.java:977) 
    at org.hibernate.search.query.dsl.impl.FieldContext.objectToString(FieldContext.java:75) 
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.buildSearchTerm(ConnectedMultiFieldsTermQueryBuilder.java:145) 
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:105) 
    at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:67) 

Спасибо за вашу помощь !

ответ

0

Вы хотите найти на arr.id, а не обр.

Просто измените .onField ("arr") на .onField ("arr.id").

+0

Это не помогло :(.. это бросает NPE сейчас –

+0

Не могли бы вы уточнить и предоставить стек? –

+0

Спасибо, Guillaume - Я не уверен, как это работает. –

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