Hibernate使用@ClassBridge搜索多个字段

时间:2015-01-06 09:49:28

标签: hibernate solr lucene hibernate-search

首先,新年快乐!

我想用多种语言索引实体标签。

我有两个实体:

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个没有分析器,没有标记器(用于排序结果),另一个用于标记器(用于全文搜索)。

我的问题是没有分析器的所有字段都已编入索引,但分析器的字段不是。只有1种语言被正确编入索引。

我尝试使用ClassBridge或FieldBridge而没有成功。

有什么建议吗?

致以最诚挚的问候,

莱奥

1 个答案:

答案 0 :(得分:1)

您不应在类/字段桥中使用分析器。分析仪将在稍后阶段应用。 Hibernate Search在所谓的ScopedAnalyzer中收集所有必需的分析器,当Lucene Document被添加到索引时会使用它。为了支持您的使用案例,您可以使用动态分析仪选择功能。另请参阅http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#d0e4119

基本方法是通过@AnalyzerDiscriminator定义特定语言的分析器。这使它们按名称全球可用。然后,您需要实施org.hibernate.search.analyzer.Decriminator。您基本上会根据您的字段名称返回正确的分析器名称(假设字段名称以某种形式包含语言代码)。最后但并非最不重要的是,您需要使用MyEntity注释@AnalyzerDiscriminator(impl = MyDiscriminator.class)