八十一ElasticSearch详解(中)

Posted 象在舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八十一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、最细切分

 

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

以上是关于八十一ElasticSearch详解(中)的主要内容,如果未能解决你的问题,请参考以下文章

八十一ElasticSearch详解(中)

八十二ElasticSearch详解(下)

八十二ElasticSearch详解(下)

八十二ElasticSearch详解(下)

八十二ElasticSearch详解(下)

八十ElasticSearch详解(上)