休眠搜索:可在同一字段上进行搜索和排序

时间:2019-03-14 00:01:37

标签: hibernate-search

我正在使用休眠搜索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注释中的任何一个时,它都有效,但同时使用两者时,则失败。

1 个答案:

答案 0 :(得分:1)

从错误消息中,您似乎写了这样的内容:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })

但就Hibernate Search而言,字段qb.sort().byField("orderName").createSort() 不存在。仅存在orderNameorderName_Search。在这种情况下,您应该写:

orderName_Sort

此外,请注意,在qb.sort().byField("orderName_Sort").createSort() 上设置analyze = Analyze.NO将有效地禁用规范化器。您可能要忽略它。