簡體   English   中英

Hibernate使用@ClassBridge搜索多個字段

[英]Hibernate Search multiple fields with @ClassBridge

首先,新年快樂!

我想用多種語言為實體標簽建立索引。

我有2個實體:

myEntity所

  • labelCode

翻譯

  • 語言代碼
  • 標簽

MyEntity.labelCode必須與Translation.code匹配,然后每個MyEntity實例都有針對多種語言的多個標簽。

我在MyEntity上編寫了ClassBridge,以向文檔中添加多個字段:

class I18NTranslationClassBridge implements FieldBridge {

Analyzer analyzer

@Override
void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
    if (value && value instanceof I18NDictionaryCategory) {
        I18NDictionaryCategory entity = value as I18NDictionaryCategory

        String labelCode = entity.getLabelCode()
        def translations = TranslationData.findAllByCode(labelCode)
        if (!analyzer) analyzer = Search.getFullTextSession(Holders.getApplicationContext().sessionFactory.currentSession).getSearchFactory().getAnalyzer('wildcardAnalyzer')
        translations?.each { translation ->
            document.add(getStringField("labelCode_${translation.languageCode}", translation.label, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO, 1f, analyzer))
            document.add(getStringField("labelCode__${translation.languageCode}_full", translation.label, Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO, 1f, null))
        }

    }
}

private static Field getStringField(String fieldName, String fieldValue, Field.Store store, Field.Index index, Field.TermVector termVector, float boost, Analyzer analyzer) {
    Field field = new Field(fieldName, fieldValue, store, index, termVector);
    field.setBoost(boost);
    // manually apply token stream from analyzer, as hibernate search does not
    // apply the specified analyzer properly
    if (analyzer) {
        try {
            field.setTokenStream(analyzer.reusableTokenStream(fieldName, new StringReader(fieldValue)));
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    return field
}

}

我想為每種語言索引2個字段:1個沒有分析器和標記符(用於排序結果),另一個沒有標記符(用於全文搜索)。

我的問題是沒有分析器的所有字段的索引都很好,但是沒有分析器的字段卻沒有索引。 只有一種語言被正確索引。

我嘗試用ClassBridge或FieldBridge來做,但沒有成功。

有什么建議嗎?

最好的祝福,

萊奧

您不應在類/字段橋中使用分析器。 分析儀將在稍后階段應用。 Hibernate Search在所謂的ScopedAnalyzer收集所有必需的分析器,當Lucene Document添加到索引時,該ScopedAnalyzer將被使用。 為了支持您的用例,您可以使用動態分析器選擇功能。 另請參見http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#d0e4119

基本方法是通過@AnalyzerDiscriminator定義特定於語言的分析器。 這使得它們可以按名稱在全球范圍內使用。 然后,您需要實現org.hibernate.search.analyzer.Decriminator 基本上,您將根據字段名稱返回正確的分析器名稱(假定字段名稱以某種形式包含語言代碼)。 最后但並非最不重要的一點是,您需要使用@AnalyzerDiscriminator(impl = MyDiscriminator.class)注釋MyEntity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM