ElasticSearch全文检索__ElasticSearch 索引模块

举报
Smy1121 发表于 2019/06/22 18:09:57 2019/06/22
【摘要】 ElasticSearch 索引模块-正排索引

ElasticSearch 索引模块-正排索引

image.png

ElasticSearch 索引模块-倒排索引

image.png


ElasticSearch 索引模块-重要组成部分

索引分析模块Analyzer:

https://www.elastic.co/guide/en/elasticsearch/reference/5.x/analysis.html

1)分解器(Tokenizer) :

2)词元过滤器(token filters)


索引建立模块Indexer

1)在建立索引过程中,分析处理过的文档将被加入到索引列表。事实上,Lucene为此仅提供了一个非常简单的API,而后自行内生地完成了此过程的所有功能。

image.png


ElasticSearch 索引模块-索引过程(1)

image.png

ElasticSearch 索引模块-索引过程(2)

image.png

ElasticSearch 索引模块-索引过程(3)

image.png


ElasticSearch 索引模块-索引和搜索

image.png


ElasticSearch 索引模块-停用词


有些词在文本中出现的频率非常高,但是对文本所携带的信息基本不产生影响,这样的词我们称之为停用词。


英文

a、an、the、of and so on

http://www.ranks.nl/stopwords/chinese-stopwords


中文

的、了、着、是等标点符号

http://www.ranks.nl/stopwords


用法:

1)文本经过分词之后,停用词通常被过滤掉,不会被进行索引。

2)在检索的时候,用户的查询中如果含有停用词,检索系统也会将其过滤掉

优点:

1)排除停用词可以加快建立索引的速度,减小索引库文件的大小。



ElasticSearch 索引模块-中文分词器

单字分词:

比如:”我们是中国人”

效果:“我”“们”“是”“中”“国”“人”


二分法分词:

比如:”我们是中国人”

效果:“我们”“们是”“是中”“中国”“国人”


词库分词:

按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。通常词库分词被认为是最理想的中文分词算法。



ElasticSearch 索引模块-常见的中文分词器

StandardAnalyzer(单字分词)

能够根据空格、符号、数字、字母、E-mail地址、IP地址以及中文字符的分析处理分割原始的文本信息。但中文文字没有完成中文分词的功能,只是按照单个的汉字进行了分割。


CJKAnalyzer(二分法)

专门用于中文文档处理的分析器,可以实现中文的多元切分和停用词过滤。


IKAnalyzer(词库分词)

当前比较流行中文分词器,对中文支持较好。属于第三方插件,需要安装


测试默认的分词对中文的支持:

curl -XPOST http://master:9200/djt/user/3/_update -d '{"doc":{"name":"我们是中国人,xxx是我们的"}}'

curl -XPOST 'http://master:9200/djt/user/_search' -d '{"query" : { "match" : { "name" : "中国人" }}}'



ElasticSearch 索引模块-集成IK中文分词插件

下载ES的IK插件:

https://github.com/medcl/elasticsearch-analysis-ik


使用maven对下载的插件进行源码编译

mvn clean package –DskipTests


拷贝和解压release下的文件: target/releases/elasticsearch-analysis-ik-*.zip 到你的 elasticsearch 插件目录:ES_HOME/plugins/ik

重启ElasticSearch服务


测试分词效果:

curl 'http://master:9200/djt/_analyze?analyzer=ik_max_word&pretty=true' -d

'{"text":"我们是中国人"}'


curl 'http://master:9200/djt/_analyze?analyzer=ik_smart&pretty=true' -d

'{"text":"我们是中国人"}'



ElasticSearch 索引模块-自定义IK词库:

创建自定义词库

首先在ik插件的config/custom目录下创建一个文件djt.dic,在文件中添加词语即可,每一个词语一行。

修改ik的配置文件IKAnalyzer.cfg.xml


将djt.dic添加到ik的配置文件中即可:

vi config/IKAnalyzer.cfg.xml

custom/mydict.dic;custom/single_word_low_freq.dic;custom/djt.dic;

重启ElasticSearch服务


测试分词效果:

curl 'http://master:9200/djt/_analyze?analyzer=ik_max_word&pretty=true' -d '{"text":"蓝瘦香菇"}' 

curl 'http://master:9200/djt/_analyze?analyzer=ik_smart&pretty=true' -d '{"text":"蓝瘦香菇"}'



ElasticSearch 索引模块-热更新IK词库

部署http服务,安装tomcat

1)切换到

/home/hadoop/app/apache-tomcat-7.0.67/webapps/ROOT


2)新建热词文件

vi hot.dic

么么哒


3)需正常访问

http://192.168.2x.210:8080/hot.dic


修改ik插件的配置文件:

vi /home/hadoop/app/elasticsearch-2.4.0/plugins/ik/config/ik/IKAnalyzer.cfg.xml 添加如下内容:

http://192.168.20.21x:8080/hot.dic


分发修改后的配置到其他es节点

重启es,可以看到加载热词库


测试动态添加热词

对比添加热词之前和之后的变化

url 'http://master:9200/djt/_analyze?analyzer=ik_max_word&pretty=true' -d

'{"text":"老司机"}'

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。