Elasticsearch

来源:互联网 发布:上海汇软科技骗局知乎 编辑:程序博客网 时间:2024/06/05 00:06

分析器

简介

全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

index :    analysis :        analyzer :            myAnalyzer :                tokenizer : standard                filter : [standard, lowercase, stop]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

index:  analysis:    analyzer:            ik:          alias: [ik_analyzer]          type: org.elasticsearch.index.analysis.IkAnalyzerProvider
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

"message": {    "type": "string",    "indexAnalyzer": "ik",    "searchAnalyzer": "ik"}
  • 1
  • 2
  • 3
  • 4
  • 5

如果没有指定索引和搜索用的analyzer,ES会用默认的analyzer来处理,也就是名字(logical name)为defaultdefault_indexdefault_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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

ES内置的一些analyzer。

analyzerlogical namedescriptionstandard analyzerstandardstandard tokenizer, standard filter, lower case filter, stop filtersimple analyzersimplelower case tokenizerstop analyzerstoplower case tokenizer, stop filterkeyword analyzerkeyword不分词,内容整体作为一个token(not_analyzed)pattern analyzerwhitespace正则表达式分词,默认匹配\W+language analyzerslang各种语言snowball analyzersnowballstandard tokenizer, standard filter, lower case filter, stop filter, snowball filtercustom analyzercustom一个Tokenizer, 零个或多个Token Filter, 零个或多个Char Filter

tokenizer:ES内置的tokenizer列表。

tokenizerlogical namedescriptionstandard tokenizerstandard edge ngram tokenizeredgeNGram keyword tokenizerkeyword不分词letter analyzerletter按单词分lowercase analyzerlowercaseletter tokenizer, lower case filterngram analyzersnGram whitespace analyzerwhitespace以空格为分隔符拆分pattern analyzerpattern定义分隔符的正则表达式uax email url analyzeruax_url_email不拆分url和emailpath hierarchy analyzerpath_hierarchy处理类似/path/to/somthing样式的字符串

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

token filterlogical namedescriptionstandard filterstandard ascii folding filterasciifolding length filterlength去掉太长或者太短的lowercase filterlowercase转成小写ngram filternGram edge ngram filteredgeNGram porter stem filterporterStem波特词干算法shingle filtershingle定义分隔符的正则表达式stop filterstop移除 stop wordsword delimiter filterword_delimiter将一个单词再拆成子分词stemmer token filterstemmer stemmer override filterstemmer_override keyword marker filterkeyword_marker keyword repeat filterkeyword_repeat kstem filterkstem snowball filtersnowball phonetic filterphonetic插件synonym filtersynonyms处理同义词compound word filterdictionary_decompounder, hyphenation_decompounder分解复合词reverse filterreverse反转字符串elision filterelision去掉缩略语truncate filtertruncate截断字符串unique filterunique pattern capture filterpattern_capture pattern replace filtepattern_replace用正则表达式替换trim filtertrim去掉空格limit token count filterlimit限制token数量hunspell filterhunspell拼写检查common grams filtercommon_grams normalization filterarabic_normalization, persian_normalization 

character filter:ES内置的character filter列表

character filterlogical namedescriptionmapping char filtermapping根据配置的映射关系替换字符html strip char filterhtml_strip去掉HTML元素pattern replace char filterpattern_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

分析器

安装IK分词法

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

    分析器

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

    分析器

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

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

分析器

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

    分析器

  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访问浏览器,如果分词,则说明配置成功。

    分析器

    异常:

    分析器

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

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


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

原创粉丝点击