天天看点

ElasticSearch—分析器

分析器组成部分

  • 字符过滤
    • 使用字符过滤器将特定字符转变为其他字符序列,例如可以将&转为and
  • 分词器
    • 根据空格,换行等符号将文本切分为一个个单词
  • 分词过滤器
    • 对每个分词使用分词过滤器,将分词进行修改,添加或删除,例如常用的小写分词过滤器
  • 分词索引
    • 分词经历了分词过滤器就会被发送到Lucene进行文档的索引

使用分析器的方式

  • 创建索引时,为特定的索引进行设置分析器
  • ES配置文件中设置全局分析器
  • 在mapping中为某个字段指定分析器

内置分析器

  • 标准分析器(standard analyzer):文本默认分析器,包括标准分词器,标准分词过滤器,小写转换分词过滤器和停用词分词过滤器
  • 简单分析器(simple analyzer):用了小写转换分词器,在非字母处分词并自动转为小写,仅适用欧洲语言
  • 空白分析器(whitespace analyzer):根据空白将文档切分为分词
  • 停用词分析器(stop analyzer):在分词流中过滤了停用词
  • 关键词分析器(keyword analyzer):将整个字段当做一个单独的分词,建议将index指定为not_analyzed,而不在映射中使用关键词分析器
  • 模式分析器(pattern analyzer):允许指定一个分词切分的模式,建议使用定制分析器组合模式分词器
  • 语言和多语言分析器:指定使用特定的语言分析器
  • 雪球分析器(snowball analyzer):在标准分析器的基础上还使用了雪球词干器对文本进行词干提取

分词器

  • 标准分词器(standard tokenizer)
    • 适合大多数欧洲语言,也处理了Unicode文本切分,但分词默认最大长度255,同时移除了逗号句号标点符号
  • 关键词分词器(keyword tokenizer)
    • 将整个文本作为单个分词提供给分词过滤器,即不做任何分词操作
  • 字母分词器(letter tokenizer)
    • 根据非字母符号将文本切分为分词
  • 小写分词器(lowercase tokenizer)
    • 结合了字母分词器和小写分词过滤器行为
  • 空白分词器(whitespace tokenizer)
    • 根据空白将文档切分成分词
  • 模式分词器(pattern tokenizer)
    • 指定任意一个模式将文本切分为分词
  • NAX URL电子邮件分词器(uax_url_email tokenizer)
    • 主要针对邮件地址
  • 路径层次分词器(path tokenizer)
    • 共享路径的文件被作为结果返回

分词过滤器

  • 标准分词过滤器(standard token filter)
    • 其实未做任何实质的操作
  • 小写分词过滤器(lowercase token filter)
    • 将任何经过的分词转换为小写
  • 长度分词过滤器(length token filter)
    • 将超出最短和最长范围的单词过滤掉
  • 停用词分词过滤器(stop token filter)
    • 将停用词从分词流中移除
  • 截断分词过滤器(truncate token filter)
    • 允许配置length参数,截断超过一定长度的分词,默认截断超过10个字符部分
  • 修剪分词过滤器(trim token filter)
    • 删除一个分词中所有空白部分
  • 限制分词数量分词过滤器(limit token count token filter)
    • 限制字段可包含分词的最大数量,只有范围内的分词才会本索引,默认是1
  • 颠倒分词过滤器(reverse token filter)
    • 颠倒每个分词
  • 唯一分词过滤器(unique token filter)
    • 值保留第一个匹配分词的元数据,其他重复的被删除
  • ASCII折叠分词过滤器(asciifolding token filter)
    • 将不是普通ASCII字符的Unicode转换为ASCII中对应的字符
  • 同义词分词过滤器(synonyms token filter)
    • 使用关键词的同义词取代原始分词
  • N元语法、侧边N元语法和滑动窗口
    • N元语法(按照N切分)
      • 设置min_gram: 生成的最小N元语法
      • 设置max_gram: 生成的最大N元语法
    • 侧边N元语法
      • 是N元语法的变种,从左端开始按照设置值匹配,例如"hello",设置值分别为2,4,会得到he,hel,hell三个分词
    • 滑动窗口分词过滤器
      • 根据分词按照设置分词,例如"foo bar baz"设置为2,3,会得到foo bar,bar baz, foo bar baz,但结果其实是包含单个分词的,因为shingles分词过滤器作用后会和原始分词器产生的分词合并,可以通过output_unigrams为false解决这个问题

继续阅读