ElasticSearch词法分析概述
(内部分享转外销)
上次的分享介绍了用于构造相关度的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
&
->&
-> (non-breaking space)<
-> <
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": " "
}
相关文章