我正在使用休眠搜索5.11.1,并且需要在String类型的同一字段上支持可搜索和可排序。阅读reference guide后,我发现了以下有关使用规范化器对分析文本进行排序的文档。
官方指南的引用:
当您需要搜索文本文档时,分析器非常有用,但是 如果要对分析的文本进行排序怎么办?那你就进去了 麻烦,因为分析的文本是多值的:在索引一个 标题为“重构:改进现有设计”的书 代码”,分析的标题实际上是(无序)集合 {“重构”,“改进”,“设计”,“现有”,“代码”}。如果你 经过这样的分析,试图对标题进行排序 可以使用,因此您的书可能会出现在D的位置(因为 “设计”),R(由于“重构”)或E, 等
最后,您可能不希望对字段进行标记 当您在这些字段上排序时。规范化程序可完全解决此问题: 它们是分析器,但没有标记器,并且具有一些运行时 检查以防止分析产生多个标记,从而 确保您的排序始终保持一致。
Hibernate Search为相关分析器提供等效的规范化器 注释:@ Normalizer,@ NormalizerDef,@ NormalizerDefs。与 分析器,您可以直接使用实现(例如 @Normalizer(impl = MyCollactionKeyAnalyzer.class))或命名 规范化器(例如@Normalizer(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注释中的任何一个时,它都有效,但同时使用两者时,则失败。
答案 0 :(得分:1)
从错误消息中,您似乎写了这样的内容:
const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })
但就Hibernate Search而言,字段qb.sort().byField("orderName").createSort()
不存在。仅存在orderName
和orderName_Search
。在这种情况下,您应该写:
orderName_Sort
此外,请注意,在qb.sort().byField("orderName_Sort").createSort()
上设置analyze = Analyze.NO
将有效地禁用规范化器。您可能要忽略它。