首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate搜索:可在同一字段上搜索和排序

Hibernate搜索:可在同一字段上搜索和排序
EN

Stack Overflow用户
提问于 2019-03-14 00:01:37
回答 1查看 992关注 0票数 1

我使用hibernate搜索5.11.1,并需要支持可搜索和可排序的相同字段的字符串类型。在阅读了参考指南之后,我发现了以下有关使用规范化器对分析文本进行排序的文档。

参考从官方指南:

当您需要在文本文档中搜索时,分析器是很棒的,但是如果您想对分析过的文本进行排序呢?然后,您会遇到一些麻烦,因为分析过的文本是多值的:当用“重构:改进现有代码的设计”的标题索引一本书时,分析的标题实际上是(无序的)集合{“重构”、“改进”、“设计”、“现有”、“代码”}。如果你试图在这样的分析之后对标题进行排序,那么你的书就可以在D(因为“设计”),或者R(因为“重构”),或者E,等等。 因此,最终,您可能不希望在对这些字段进行排序时将字段标记化。规范器完全解决了这个问题:它们是分析器,但没有标记器,并且使用一些运行时检查来阻止分析产生多个令牌,从而确保您的排序始终是一致的。 Hibernate搜索为相关分析器注释提供了等效的规范化器:@NormalizerDef,@NormalizerDefs。与分析器一样,您可以直接使用实现(例如@正常化器(impl= MyCollactionKeyAnalyzer.class))或命名规范化器(例如@正常化器(definition= "myNormalizer")和@NormalizerDef(filters = @TokenFilterDef(factory = LowerCaseFilterFactory.class))。

基于上述,我编写了以下代码:

代码语言:javascript
运行
复制
@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注释时起作用,但在使用这两种注释时都会失败。

EN

Stack Overflow用户

回答已采纳

发布于 2019-03-14 07:31:35

从错误消息来看,您似乎编写了如下内容:

代码语言:javascript
运行
复制
qb.sort().byField("orderName").createSort()

但是就Hibernate搜索而言,字段orderName并不存在。只有orderName_SearchorderName_Sort存在。在这种情况下,您应该写:

代码语言:javascript
运行
复制
qb.sort().byField("orderName_Sort").createSort()

另外,请注意,在analyze = Analyze.NO上设置orderName_Sort将有效地禁用您的正常化器。你可能想把这事忘了。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55152925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档