八十一ElasticSearch详解(中)
Posted 象在舞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八十一ElasticSearch详解(中)相关的知识,希望对你有一定的参考价值。
上一篇文章我们着重从ElasticSearch的操作工具、存储方式以及检索等方面触发介绍了一下ElasticSearch的使用,本文我们从搜索原理入手继续看一下ElasticSearch是如何使用的。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~
目录
一、正排索引和倒排索引
正排索引记录文档id到文档内容、单词的关联关系。正排索引表是以文档的ID为关键字,表中记录文档中每个字段的值信息,主要场景是通过查询id来把整条文档拿出来,一般mysql关系型数据库是这种方式来查询的。这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护,当对ID查询的时候检索效率会很高。
倒排索引表以字或词为关键字进行索引,表中关键字所对应的记录项记录了出现这个字或词的所有文档,每个字段记录该文档的ID和关键字在该文档中出现的位置情况。倒排索引记录单词到文档id的关联关系,包含:
1、单词词典(Term DicTionary):记录所有文档的单词,一般比较大。
2、倒排索引(Posting List):记录单词倒排列表的关联信息。
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是一旦完成创建,在查询的时候由于可以一次得到查询关键字所对应的所有文档。
二、分词
分词是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分析,在es里面称为Analysis。
2.1 分词机制
分词机制如下所示:
Character Filter | 对原始文本进行处理 | 例:去除html标签、特殊字符等 |
---|---|---|
Tokenizer | 将原始文本进行分词 | 例:象在舞是山东人-->象在舞,是,山东人 |
Token Filters | 分词后的关键字进行加工 | 例:转小写、删除语气词、近义词和同义词等 |
2.2 分词API
2.2.1 直接指定分词器
POST _analyze
{
"analyzer": "standard",
"text":"我爱中国"
}
参数释义如下:
{
"token": "我", #分词
"start_offset": 0, #开始偏移
"end_offset": 1, #结束偏移
"type": "<IDEOGRAPHIC>", #单词类型
"position": 0 #位置
}
2.2.2 针对索引的字段进行分词测试
2.2.3 自定义分词器
2.3 ElasticSearch自带的分词器
分词器 | 特点 |
---|---|
Standard(es默认) | 支持多语言,按词切分并做小写处理 |
Simple | 按照非字母切分,小写处理 |
Whitespace | 按照空格来切分 |
Stop | 去除语气助词,如the、an、的、这等 |
Keyword | 不分词 |
Pattern | 正则分词,默认\\w+,即非字词符号做分割符 |
Language | 常见语言的分词器(30+) |
2.4 常见的中文分词器
分词器名称 | 介绍 | 特点 | 地址 |
---|---|---|---|
IK | 实现中英文单词切分 | 自定义词库 | https://github.com/medcl/elasticsearch-analysis-ik |
Jieba | python流行分词系统,支持分词和词性标注 | 支持繁体、自定义、并行分词 | http://github.com/sing1ee/elasticsearch-jieba-plugin |
Hanlp | 由一系列模型于算法组成的java工具包 | 普及自然语言处理在生产环境中的应用 | https://github.com/hankcs/HanLP |
THULAC | 清华大学中文词法分析工具包 | 具有中文分词和词性标注功能 | https://github.com/microbun/elasticsearch-thulac-plugin |
2.5 Character Filters
在进行Tokenizer之前对原始文本进行处理,如增加、删除或替换字符等。这里需要注意的是:进行处理后,会影响后续tokenizer解析的position和offset。
HTML Strip | 去除html标签和转换html实体 |
---|---|
Mapping | 字符串替换操作 |
Pattern Replace | 正则匹配替换 |
2.6 Token Filter
对输出的单词(term)进行增加、删除、修改等操作。
Lowercase | 将所有term转换为小写 |
---|---|
stop | 删除stop words |
NGram | 和Edge NGram连词分割 |
Synonym | 添加近义词的term |
2.7 自定义分词API
PUT xzw_analyzer
{
"settings": {
"analysis": {
"analyzer": {
"my":{
"tokenizer":"punctuation",
"type":"custom",
"char_filter":["emoticons"],
"filter":["lowercase","english_stop"]
}
},
"tokenizer": {
"punctuation":{
"type":"pattern",
"pattern":"[.,!?]"
}
},
"char_filter": {
"emoticons":{
"type":"mapping",
"mappings":[
":)=>_happy_",
":(=>_sad_"
]
}
},
"filter": {
"english_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
}
}
测试自己定义的分词API:
三、IK分词器
3.1 下载与安装
1、点击此处下载IK分词器的安装包,这里需要注意的是,应该下载与ES版本相对应的安装包。
2、将下载好的安装包上传到ES解压目录的plugins目录下并解压
3、修改所属的用户和用户组
[root@master plugins]# chown -R es:es analysis-ik
4、重新启动ES,发现加载了IK的配置文件,表示安装成功
3.2 IK分词器测试
IK提供了两个分词算法ik_smart和ik_max_word,其中ik_smart为最少切分,ik_max_word为最细粒度划分。
1、最少切分
2、最细切分
以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~
以上是关于八十一ElasticSearch详解(中)的主要内容,如果未能解决你的问题,请参考以下文章