Elasticsearch - 指定分析器

时间:2023-01-13 08:16:36

分析器

简介

全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器);这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器), 被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)。

ES内置了很多Analyzer, 还有很多第三方的Analyzer插件, 比如一些处理中文的Analyzer(中文分词)。

analyzer、 tokenizer、 filter可以在elasticsearch.yml 配置, 下面是配置例子

index :
analysis :
analyzer :
standard :
type : standard
stopwords : [stop1, stop2]
myAnalyzer1 :
type : standard
stopwords : [stop1, stop2, stop3]
max_token_length : 500
# configure a custom analyzer which is
# exactly like the default standard analyzer
myAnalyzer2 :
tokenizer : standard
filter : [standard, lowercase, stop]
tokenizer :
myTokenizer1 :
type : standard
max_token_length : 900
myTokenizer2 :
type : keyword
buffer_size : 512
filter :
myTokenFilter1 :
type : stop
stopwords : [stop1, stop2, stop3, stop4]
myTokenFilter2 :
type : length
min : 0
max : 2000

analyzer:ES内置若干analyzer, 另外还可以用内置的character filter, tokenizer, token filter组装一个analyzer(custom analyzer), 比如

index :
analysis :
analyzer :
myAnalyzer :
tokenizer : standard
filter : [standard, lowercase, stop]

如果你要使用第三方的analyzer插件,需要先在配置文件elasticsearch.yml中注册, 下面是配置IkAnalyzer的例子

index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider

当一个analyzer在配置文件中被注册到一个名字(logical name)下后,在mapping定义或者一些API里就可以用这个名字来引用该analyzer了,比如

"message": {
"type": "string",
"indexAnalyzer": "ik",
"searchAnalyzer": "ik"
}

如果没有指定索引和搜索用的analyzer,ES会用默认的analyzer来处理,也就是名字(logical name)为default, default_index, default_search的analyzer。

从名字可以看出来,default是索引和搜索时用的默认的analyzer,default_index是索引时用的默认的analyzer, default_search是查询时用的默认analyzer。

下面是在elasticsearch.yml中配置默认analyzer的例子

index:

analysis:

analyzer:

default_index:

tokenizer: standard

filter: [standard, lowercase, my_synonym, my_snow]

default_search:

tokenizer: standard

filter: [standard, lowercase, stop]

ES内置的一些analyzer。

analyzer logical name description
standard analyzer standard standard tokenizer, standard filter, lower case filter, stop filter
simple analyzer simple lower case tokenizer
stop analyzer stop lower case tokenizer, stop filter
keyword analyzer keyword 不分词,内容整体作为一个token(not_analyzed)
pattern analyzer whitespace 正则表达式分词,默认匹配\W+
language analyzers lang 各种语言
snowball analyzer snowball standard tokenizer, standard filter, lower case filter, stop filter, snowball filter
custom analyzer custom 一个Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter

tokenizer:ES内置的tokenizer列表。

tokenizer logical name description
standard tokenizer standard
edge ngram tokenizer edgeNGram
keyword tokenizer keyword 不分词
letter analyzer letter 按单词分
lowercase analyzer lowercase letter tokenizer, lower case filter
ngram analyzers nGram
whitespace analyzer whitespace 以空格为分隔符拆分
pattern analyzer pattern 定义分隔符的正则表达式
uax email url analyzer uax_url_email 不拆分url和email
path hierarchy analyzer path_hierarchy 处理类似/path/to/somthing样式的字符串

token filter:ES内置的token filter列表。

token filter logical name description
standard filter standard
ascii folding filter asciifolding
length filter length 去掉太长或者太短的
lowercase filter lowercase 转成小写
ngram filter nGram
edge ngram filter edgeNGram
porter stem filter porterStem 波特词干算法
shingle filter shingle 定义分隔符的正则表达式
stop filter stop 移除 stop words
word delimiter filter word_delimiter 将一个单词再拆成子分词
stemmer token filter stemmer
stemmer override filter stemmer_override
keyword marker filter keyword_marker
keyword repeat filter keyword_repeat
kstem filter kstem
snowball filter snowball
phonetic filter phonetic 插件
synonym filter synonyms 处理同义词
compound word filter dictionary_decompounder, hyphenation_decompounder 分解复合词
reverse filter reverse 反转字符串
elision filter elision 去掉缩略语
truncate filter truncate 截断字符串
unique filter unique
pattern capture filter pattern_capture
pattern replace filte pattern_replace 用正则表达式替换
trim filter trim 去掉空格
limit token count filter limit 限制token数量
hunspell filter hunspell 拼写检查
common grams filter common_grams
normalization filter arabic_normalization, persian_normalization

character filter:ES内置的character filter列表

character filter logical name description
mapping char filter mapping 根据配置的映射关系替换字符
html strip char filter html_strip 去掉HTML元素
pattern replace char filter pattern_replace 用正则表达式处理字符串

分词插件配置实践

IK Analyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包,最初的时候,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件,从3.0版本之后,IK逐渐成为面向java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化

当安装完Elasticsearch之后,默认已经含有一个分词法,就是standard,这个分词法对英文的支持还可以,但是对中文的支持非常差劲,如图所示:

http://localhost:9200/_analyze?analyzer=standard&text=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%AC%A2%E8%BF%8E%E6%82%A8

Elasticsearch - 指定分析器

安装IK分词法

  1. 首先通过Git将源码下载下来,打开git客户端输入命令:git clone https://github.com/medcl/elasticsearch-analysis-ik,如果没有安装git,则直接下载zip包。
  2. 下载之后进入到下载的文件夹下,如图所示:

    Elasticsearch - 指定分析器

  3. 因为其源码使用的maven开发,故而使用maven编译项目。编译成功在下面会提示Succes。

    Elasticsearch - 指定分析器

  4. 打开编译后的target\releases,解压压缩包,然后进入解压的压缩包里面可以看到几个jar包和配置文件。

  5. 在Elasticsearch的安装的plugin下创建文件夹ik。

Elasticsearch - 指定分析器

  1. 跳转到ik文件夹下,将4中所说的文件拷贝到5中ik文件夹下。

    Elasticsearch - 指定分析器

  2. 重新启动ElasticSearch,使用http://localhost:9200/_analyze?analyzer=ik_max_word&&text=%E4%BD%A0%E5%A5%BD%EF%BC%8C%E6%AC%A2%E8%BF%8E%E6%82%A8访问浏览器,如果分词,则说明配置成功。

    Elasticsearch - 指定分析器

    异常:

    Elasticsearch - 指定分析器

    异常的提示已经告诉我们是为什么了,大家自己留意version问题。

dedc大神的sample elasticsearch中文发行版,针对中文集成了相关插件,方便新手学习测试. 可直接运行。前往GitHub


参考资料:
网上资料
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/71080285
作者:WSYW126