2016-05-30 2 views
1

Я использую Hibernate Search в версии 5.0.0.Final. У меня есть 1 поле, проиндексированное в 1 таблице. Я использую FieldBridge проиндексировать это поле:HibernateSearch запрос на виртуальные поля, индексированные с помощью FieldBridge

public class CustomBridge implements FieldBridge { 

    @Override 
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { 
     MyFieldType file = (ProductOrderJsonEntity) value; 
     if (file.getA() != null && file.getB() != null) { 
      luceneOptions.addFieldToDocument(name + ".ABconcat", file.getA() + file.getB(), document); 
     } 
    } 
} 

Я использую FieldBridge индексировать поля, которое не существует в БД, поэтому, когда я пытаюсь сделать запрос, как это, он выходит из строя:

EntityManager em = entityManagerFactory.createEntityManager(); 
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em); 
em.getTransaction().begin(); 

QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(MyEntity.class).get(); 
org.apache.lucene.search.Query luceneQuery = qb.keyword().onFields("productOrder.internalReference", "techId").matching(keyword).createQuery(); 

javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, MyEntity.class); 

... со следующей ошибкой:

org.hibernate.search.exception.SearchException: Unable to find field field.ABconcat in com.something.myapp.MyEntity 

по-видимому, пытается отобразить поля, которые я даю в luceneQuery к полям объектов (MyEntity в моем случае).

Есть ли способ запросить индекс в настраиваемых полях, которые не существуют в базе данных?

Спасибо.

ответ

1

Я только что узнал о this post, который объясняет, что вы можете запросить поле, которые были проиндексированы через FieldBridge так:

Запрос ориентации несколько полей

int year = datetime.getYear(); 
int month = datetime.getMonthOfYear(); 
int day = datetime.getDayOfMonth(); 

QueryBuilder qb = sm.buildQueryBuilderForClass(BlogEntry.class).get(); 
Query q = qb.bool() 
    .must(qb.keyword().onField("creationdate.year").ignoreFieldBridge().ignoreAnalyzer() 
       .matching(year).createQuery()) 
    .must(qb.keyword().onField("creationdate.month").ignoreFieldBridge().ignoreAnalyzer() 
       .matching(month).createQuery()) 
    .must(qb.keyword().onField("creationdate.day").ignoreFieldBridge().ignoreAnalyzer() 
       .matching(day).createQuery()) 
    .createQuery(); 

CacheQuery cq = sm.getQuery(q, BlogEntry.class); 
System.out.println(cq.getResultSize()); 

Ключ к:

цели непосредственно на каждое поле,

отключить полевой мост преобразование для запроса,

и, вероятно, это хорошая идея отключить анализатор.

Это довольно продвинутая тема, и запрос DSL будет делать правильно большую часть времени. Пока не нужно паниковать.

Но в случае, если вы нажмете на сложные проблемы, интересно, что происходит внизу.

+0

Ваш ответ верен, в дополнение к этому, если вы можете перейти на Hibernate Search 5.5.3 - вы можете объявить поля, которые вы создаете в FieldBridge, с помощью 'org.hibernate.search.bridge .MetadataProvidingFieldBridge'. Это должно улучшить интеграцию DSL. См. Также https://hibernate.atlassian.net/browse/HSEARCH 2021 – Sanne

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