八十一、ElasticSearch详解(中)

       上一篇文章我们着重从ElasticSearch的操作工具、存储方式以及检索等方面触发介绍了一下ElasticSearch的使用,本文我们从搜索原理入手继续看一下ElasticSearch是如何使用的。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~


目录

一、正排索引和倒排索引

二、分词

2.1 分词机制

2.2 分词API

2.2.1 直接指定分词器

2.2.2 针对索引的字段进行分词测试

2.2.3 自定义分词器

2.3 ElasticSearch自带的分词器

2.4 常见的中文分词器

2.5 Character Filters

​2.6 Token Filter

2.7 自定义分词API

三、IK分词器

3.1 下载与安装

3.2 IK分词器测试


一、正排索引和倒排索引

       正排索引记录文档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
Jiebapython流行分词系统,支持分词和词性标注支持繁体、自定义、并行分词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、最细切分

 

       以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象在舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值