我使用hibernate搜索5.11.1,并需要支持可搜索和可排序的相同字段的字符串类型。在阅读了参考指南之后,我发现了以下有关使用规范化器对分析文本进行排序的文档。
参考从官方指南:
当您需要在文本文档中搜索时,分析器是很棒的,但是如果您想对分析过的文本进行排序呢?然后,您会遇到一些麻烦,因为分析过的文本是多值的:当用“重构:改进现有代码的设计”的标题索引一本书时,分析的标题实际上是(无序的)集合{“重构”、“改进”、“设计”、“现有”、“代码”}。如果你试图在这样的分析之后对标题进行排序,那么你的书就可以在D(因为“设计”),或者R(因为“重构”),或者E,等等。 因此,最终,您可能不希望在对这些字段进行排序时将字段标记化。规范器完全解决了这个问题:它们是分析器,但没有标记器,并且使用一些运行时检查来阻止分析产生多个令牌,从而确保您的排序始终是一致的。 Hibernate搜索为相关分析器注释提供了等效的规范化器:@NormalizerDef,@NormalizerDefs。与分析器一样,您可以直接使用实现(例如@正常化器(impl= MyCollactionKeyAnalyzer.class))或命名规范化器(例如@正常化器(definition= "myNormalizer")和@NormalizerDef(filters = @TokenFilterDef(factory = LowerCaseFilterFactory.class))。
基于上述,我编写了以下代码:
@Entity
@Indexed
@AnalyzerDef(name = "en", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class)
})
@NormalizerDef(name = "lowercase", filters = {
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class)
}
)
@Table(name = "ORDER")
public class Order {
//Some other fields that are omitted for brevity here
@Field(name = "orderName_Search", store = Store.YES, analyze = Analyze.YES, analyzer = @Analyzer(definition = "en"))
@Field(name = "orderName_Sort", store = Store.YES, analyze = Analyze.NO, normalizer = @Normalizer(definition = "lowercase"))
@SortableField(forField = "orderName_Sort")
@Column(name = "ORDER_NAME")
private String orderName;
}但是,当我遇到以下错误时,它似乎不起作用。
com.appnexus.konnect.web.exceptions.ConnectExceptionHandler错误-异常org.hibernate.search.exception.SearchException:无法自动确定字段“orderName”的字段类型。使用byField(String,Sort.Type)显式地提供排序类型
我的问题是哪里出了问题?它只在使用@Field注释时起作用,但在使用这两种注释时都会失败。
发布于 2019-03-14 07:31:35
从错误消息来看,您似乎编写了如下内容:
qb.sort().byField("orderName").createSort()但是就Hibernate搜索而言,字段orderName并不存在。只有orderName_Search和orderName_Sort存在。在这种情况下,您应该写:
qb.sort().byField("orderName_Sort").createSort()另外,请注意,在analyze = Analyze.NO上设置orderName_Sort将有效地禁用您的正常化器。你可能想把这事忘了。
https://stackoverflow.com/questions/55152925
复制相似问题