7.4.3.2. 命名分析器


分析器可能会变得非常复杂。因此,增加了 Hibernate 搜索分析器定义的概念。分析器定义可以被许多 @Analyzer 声明重复使用,其包含:

  • name:用于引用定义的唯一字符串
  • char 过滤器列表:每个 char 过滤器负责在令牌化之前预先处理输入字符。Char 过滤器可以添加、更改或删除字符;一个常用的用法是字符规范化
  • 令牌器:负责将输入流令牌到单个单词
  • 过滤器列表:每个过滤器负责删除、修改或有时在 tokenizer 提供的流中添加词语

这种任务分离(一个 char 过滤器列表和一个跟一个过滤器列表)可轻松重复利用各个组件,并让您以非常灵活的方式(如 Lego)构建自定义分析器。通常而言,Car 过滤器在字符输入中执行一些预处理,然后令牌程序通过将字符输入转换为令牌来启动令牌化过程,然后由 TokenFilters 进一步处理。Hibernate Search 利用 Solr 分析器框架来支持此基础架构。

让我们回顾一下下面描述的一个具体示例。首先,一个 char 过滤器由工厂定义。在我们的示例中,使用了映射 char 过滤器,并将根据映射文件中指定的规则替换输入中的字符。接下来定义了令牌程序。这个示例使用标准令牌程序。最后但并非最不重要的是,一个过滤器列表由其工厂定义。在我们的示例中,StopFilter 过滤器构建为读取专用的词语属性文件。过滤器还应忽略大小写。

示例:@AnalyzerDef 和 Solr Framework

@AnalyzerDef(name="customanalyzer",
  charFilters = {
    @CharFilterDef(factory = MappingCharFilterFactory.class, params = {
      @Parameter(name = "mapping",
        value = "org/hibernate/search/test/analyzer/solr/mapping-chars.properties")
    })
  },
  tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
  filters = {
    @TokenFilterDef(factory = ISOLatin1AccentFilterFactory.class),
    @TokenFilterDef(factory = LowerCaseFilterFactory.class),
    @TokenFilterDef(factory = StopFilterFactory.class, params = {
      @Parameter(name="words",
        value= "org/hibernate/search/test/analyzer/solr/stoplist.properties" ),
      @Parameter(name="ignoreCase", value="true")
    })
})
public class Team {
    ...
}

注意

过滤器和 char 过滤器按照 @AnalyzerDef 注释中定义的顺序应用。订单很重要!

某些令牌程序、令牌过滤器或 char 过滤器会加载资源,如配置或元数据文件。stop 过滤器和同义词过滤器就是这种情况。如果资源 charset 没有使用虚拟机默认值,您可以通过添加 resource_charset 参数来显式指定它。

示例:使用特定 Charset 加载属性文件

@AnalyzerDef(name="customanalyzer",
  charFilters = {
    @CharFilterDef(factory = MappingCharFilterFactory.class, params = {
      @Parameter(name = "mapping",
        value = "org/hibernate/search/test/analyzer/solr/mapping-chars.properties")
    })
  },
  tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
  filters = {
    @TokenFilterDef(factory = ISOLatin1AccentFilterFactory.class),
    @TokenFilterDef(factory = LowerCaseFilterFactory.class),
    @TokenFilterDef(factory = StopFilterFactory.class, params = {
      @Parameter(name="words",
        value= "org/hibernate/search/test/analyzer/solr/stoplist.properties" ),
      @Parameter(name="resource_charset", value = "UTF-16BE"),
      @Parameter(name="ignoreCase", value="true")
  })
})
public class Team {
    ...
}

定义之后,分析器定义就可通过 @Analyzer 声明重复利用,如下例中所示:

示例:按名称引用分析器

@Entity
@Indexed
@AnalyzerDef(name="customanalyzer", ... )
public class Team {
    @Id
    @DocumentId
    @GeneratedValue
    private Integer id;

    @Field
    private String name;

    @Field
    private String location;

    @Field
    @Analyzer(definition = "customanalyzer")
    private String description;
}

@AnalyzerDef 声明的 AnalyzerDef 实例通过其名称在 SearchFactory 中也可用,该名称在构建查询时非常有用。

Analyzer analyzer = fullTextSession.getSearchFactory().getAnalyzer("customanalyzer");

查询中的字段必须使用用于索引字段的同一分析器进行分析,以便它们使用共同"语言":在查询和索引过程之间重复利用相同的令牌。该规则有一些例外情况,但大部分时候确实如此。尊重它,除非您知道自己正在做什么。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部