2016-05-30 6 views
1

私はバージョン5.0.0.FinalでHibernate Searchを使用しています。 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); 
     } 
    } 
} 

私はインデックスにDBに存在しないフィールドを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 

は、どうやらそれは私が(私の場合はMyEntity)オブジェクトフィールドにluceneQueryに与えるフィールドをマップしようとします。

データベースに存在しないカスタムフィールドのインデックスを照会する方法はありますか?

ありがとうございました。

答えて

1

私はちょうどあなたがこのようFieldBridgeによってインデックス付けされているフィールドを照会することができることを説明している程度this postを発見:

:複数のフィールド

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

関連する問題