[英]Hibernate Search multiple fields with @ClassBridge
首先,新年快樂!
我想用多種語言為實體標簽建立索引。
我有2個實體:
myEntity所
翻譯
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.