ElasticSearch词法分析概述

2020-06-03 00:00:00 过滤器 转换器 字符 分析器 词干

(内部分享转外销)

上次的分享介绍了用于构造相关度的TF-IDF及其改进算法BM25 ,可以看到的这些算法都以单词为单元,计算对应的相关度,这次的分享主要介绍Elasticsearch是如何从一个大段文本中产生这样的单元的

(知乎似乎不支持目录插入?)

本文基本是ES的官方文档的翻译,掺杂了少量在使用这些组件的感悟


<!-- TOC -->

- [主要组件和处理流程](#主要组件和处理流程)
- [Tokenizer 标记器](#tokenizer-标记器)
- [Filters 过滤器](#filters-过滤器)
- [Analyzers 分析器](#analyzers-分析器)
- [Normalizers 规范器](#normalizers-规范器)
- [调试](#调试)
- [处理流](#处理流)
- [详细列表(ES 6.3)](#详细列表es-63)
- [Tokenizer](#tokenizer)
- [Standard Tokenizer](#standard-tokenizer)
- [Letter Tokenizer](#letter-tokenizer)
- [Lowercase Tokenizer](#lowercase-tokenizer)
- [Whitespace Tokenizer](#whitespace-tokenizer)
- [UAX URL Email Tokenizer](#uax-url-email-tokenizer)
- [Classic Tokenizer](#classic-tokenizer)
- [NGram Tokenizer](#ngram-tokenizer)
- [Edge NGram Tokenizer](#edge-ngram-tokenizer)
- [Keyword Tokenizer](#keyword-tokenizer)
- [Pattern Tokenizer](#pattern-tokenizer)
- [Char Group Tokenizer](#char-group-tokenizer)
- [Path Tokenizer](#path-tokenizer)
- [Filters 过滤/转换器](#filters-过滤转换器)
- [和Tokenizer的差不多的](#和tokenizer的差不多的)
- [词干转换器Stemmer](#词干转换器stemmer)
- [Keyword 和Stemmer的搭配](#keyword-和stemmer的搭配)
- [Shingle](#shingle)
- [Stop Token Filter](#stop-token-filter)
- [Phonetic 同读音过滤器](#phonetic-同读音过滤器)
- [Synonym 同义词](#synonym-同义词)
- [对齐、去重](#对齐去重)
- [正则:捕获和替换](#正则捕获和替换)
- [Normalization Filter](#normalization-filter)

<!-- /TOC -->


主要组件和处理流程

Tokenizer 标记器

接收字符串流,把其打碎成tokens (通常是单个单词),输出是tokens的流
一个简单的whitespace tokenizer,会按照空格打碎,比如把"Quick brown fox!"转换成["Quick", "brown", "fox!"]

更多的Tokenizer后面我会介绍

Filters 过滤器

分为 字符(Character)层的过滤器和Token层的过滤器,可以过滤或转换一些字符或者Token 例如可以过滤掉HTML标签<b>或者解码HTML

&amp;->&
&nbsp;-> (non-breaking space)
&lt;-> <

Analyzers 分析器

相当于是Tokenizer+Filter,内置了若干常用的分析器

例如上文说的Whitespace

Normalizers 规范器

类似于分析器,但只能产生出单个Token,而分析器是可以一对多的 另外,Normalizers会使得 文本进入引擎后,在后面的流程中得到的都是变换后的结果 举个栗子:简单的lowercase 功能是小写化

在Analyzer中
title = "Quick brown fox!"会转换成["quick", "brown", "fox!"] 并计算对应的TFIDF分数,但搜索出来的时候,显示的title依旧是 "Quick brown fox!"
如果在Title这个字段上应用的是Normalizers,那么除了索引时的转换,从索引中拿出来的对应title将会变成"quick brown fox!"

这种情况会在ES 的keyword类型(可以认为是unique或hash)的使用上产生差异

调试

可以在{host}/_analyze上调试词法分析,结合Tokenizer/Filter 以获得预期的结果

POST _analyzer
{
  "analyzer":"arabic",
  "text": "                                           "
}

相关文章