Elasticsearch分词

眉间皱痕 提交于 2020-01-14 18:06:35

一、 analysis与analyzer

analysis:

  文本分析,是将全文本转换为一系列单词的过程,也叫分词。analysis是通过analyzer(分词器)来实现的,可以使用Elasticearch内置的分词器,也可以自己去定制一些分词器。除了在数据写入时将词条进行转换,那么在查询的时候也需要使用相同的分析器对语句进行分析。

analyzer(分词器):

由三部分组成:

  1. Character Filter:将文本中html标签剔除掉。
  2. Tokenizer:按照规则进行分词,在英文中按照空格分词
  3. Token Filter:将切分的单词进行加工,小写,删除 stopwords(停顿词,a、an、the、is等),增加同义词
1.1 内置的分词器
分词器名称 处理过程
Standard Analyzer 默认的分词器,按词切分,小写处理
Simple Analyzer 按照非字母切分(符号被过滤),小写处理
Stop Analyzer 小写处理,停用词过滤(the, a, this)
Whitespace Analyzer 按照空格切分,不转小写
Keyword Analyzer 不分词,直接将输入当做输出
Pattern Analyzer 正则表达式,默认是\W+(非字符串分隔)
1.2 内置分词器使用示例
  1. Standard Analyzer
GET _analyze
{
  "analyzer": "standard",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}
  1. Simple Analyzer
GET _analyze
{
  "analyzer": "simple",
  "text": "2 Running quick brown-foxes leap over lazy dog in the summer evening"
}

1.3 中文分词

  中文分词在所有搜索引擎中都是一个很大的难点,中文的句子应该是切分成一个个的词,但是一句中文,在不同的上下文,其实是不同的理解,例如以下:

这个苹果,不大好吃/这个苹果,不大,好吃
1.3.1 IK分词器

  IK分词器支持自定义词库,支持更新分词字典,地址为https://github.com/medcl/elasticsearch-analysis-ik

安装步骤:

1. 下载zip包,下载路径为:https://github.com/medcl/elasticsearch-analysis-ik/releases

2. 在Elasticsearch的plugins目录下创建名为analysis-ik的目录,将下载好的zip包解压在该目录下

3. 再dos命令进入Elasticsearch的bin目录下,执行elasticsearch-plugin.bat list即可查看到该插件

IK分词插件对应的分词器有以下几种:

  • ik_smart
  • ik_max_word
1.3.2 HanLP分词器

安装步骤:

1. 下载zip包,下载路径:<https://pan.baidu.com/s/1mFPNJXgiTPzZeqEjH_zifw#list/path=%2F>,密码i0o7

2. 在Elasticsearch的plugins目录下创建名为analysis-hanlp目录,将下载好的zip包解压到该目录下

3. 下载词库,地址为:https://github.com/hankcs/HanLP/releases

4. 将analysis-hanlp目录下的data目录删除掉,然后将词库data-for-1.7.5.zip解压到analysis-hanlp目录下

5. 将第二步解压目录下的config文件夹中两个文件hanlp.properties和hanlp-remote.xml拷贝到Elasticsearch安装目录中config目录下analysis-hanlp文件夹中(analysis-hanlp目录需手动自己创建)

6. 将课件中hanlp文件夹中提供的六个文件(可自己定义)拷贝到$ES_HOME\plugins\analysis-hanlp\data\dictionary\custom 目录下。

HanLP对应的分词器如下:

  • hanlp:默认的
  • hanlp_standard:标准分词
  • hanlp_index:索引分词
  • hanlp_nlp:nlp分词
  • hanlp_n_short:N-最短路分词
  • hanlp_speed:极速词典分词
1.3.3 pingyin分词器

安装步骤:

1. 下载ZIP包,下载路径为:https://github.com/medcl/elasticsearch-analysis-pinyin/releases

2. 在Elasticsearch的plugins目录下创建名为 analysis-pinyin 的目录,将下载好的zip包解压在该目录下.
1.4 中文分词演示

ik_smart

GET _analyze
{
  "analyzer": "ik_smart",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

hanlp

GET _analyze
{
  "analyzer": "hanlp",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}

hanlp_standard

GET _analyze
{
  "analyzer": "hanlp_standard",
  "text": ["剑桥分析公司多位高管对卧底记者说,他们确保了唐纳德·特朗普在总统大选中获胜"]
}
1.5 分词的实际应用

  在如下列举了很多的分词器,那么在实际中该如何使用?

1.5.1 设置mapping

想要使用分词器,先要指定我们想要对哪个字段使用何种,如下所示:

PUT customers
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "hanlp_nlp"
      }
    }
  }
}
1.5.2 插入数据
PUT customers/_bulk
{"index":{"_id": 1}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{"_id": 2}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{"_id": 3}}
{"content":"剑桥的网盘不好用"}
1.5.3 查询
GET customers/_search
{
  "query": {
    "match": {
      "content": "密码"
    }
  }
}
1.6 拼音分词器

在查询的过程中我们可能需要使用拼音来进行查询,在中文分词器中我们介绍过pinyin分词器,那么在实际工作中该如何使用呢?

1.6.1 设置settings
PUT /medcl 
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "pinyin_analyzer" : {
                    "tokenizer" : "my_pinyin"
                 }
            },
            "tokenizer" : {
                "my_pinyin" : {
                    "type" : "pinyin",
                    "keep_separate_first_letter" : false,
                    "keep_full_pinyin" : true,
                    "keep_original" : true,
                    "limit_first_letter_length" : 16,
                    "lowercase" : true,
                    "remove_duplicated_term" : true
                }
            }
        }
    }
}

可用参数:
    - "keep_separate_first_letter"  true,刘德华 -> l,d,h  false,刘德华 -> ldh
    - "keep_full_pinyin"  true, 刘德华 -> liu,de,hua
    - "keep_joined_full_pinyin" true,刘德华 -> liudehau
    - "keep_original"  true,刘德华 -> 刘德华
    - "limit_first_letter_length"  16,  费拉基米尔伊里奇 -> feilajimieryiliq全拼的长度限制
    - "lowercase"  转小写
    - "remove_duplicated_term" true,删除重复的拼音项,刘德华的liu与柳岩的liu,只保留一个

如上所示,我们基于现有的拼音分词器定制了一个名为 pinyin_analyzer 这样一个分词器。可用的参数可以参照:https://github.com/medcl/elasticsearch-analysis-pinyin

1.6.2 设置mapping
PUT medcl/_mapping
{
        "properties": {
            "name": {
                "type": "keyword",
                "fields": {
                    "pinyin": {
                        "type": "text",
                        "analyzer": "pinyin_analyzer",
                        "boost": 10
                    }
                }
            }
        }
}
1.6.3 数据的插入
POST medcl/_bulk
{"index":{}}
{"name": "刘德华"}
{"index":{}}
{"name": "张学友"}
{"index":{}}
{"name": "四大天王"}
{"index":{}}
{"name": "柳岩"}
{"index":{}}
{"name": "angel baby"}
1.6.4 查询
GET medcl/_search
{
  "query": {
    "match": {
      "name.pinyin": "ldh"
    }
  }
}
1.7 中文、拼音混合查找
1.7.1 设置settings
PUT goods
{
  "settings": {
    "analysis": {
      "analyzer": {
        "hanlp_standard_pinyin":{
          "type": "custom",
          "tokenizer": "hanlp_standard",
          "filter": ["my_pinyin"]
        }
      },
      "filter": {
        "my_pinyin": {
          "type" : "pinyin",
          "keep_separate_first_letter" : false,
          "keep_full_pinyin" : true,
          "keep_original" : true,
          "limit_first_letter_length" : 16,
          "lowercase" : true,
          "remove_duplicated_term" : true
        }
      }
    }
  }
}
1.7.2 mappings设置
PUT goods/_mapping
{"properties": {
    "content": {
      "type": "text",
      "analyzer": "hanlp_standard_pinyin"
    }
  }
}
1.7.3 添加数据
POST goods/_bulk
{"index":{}}
{"content":"如不能登录,请在百端登录百度首页,点击【登录遇到问题】,进行找回密码操作"}
{"index":{}}
{"content":"网盘客户端访问隐藏空间需要输入密码方可进入。"}
{"index":{}}
{"content":"剑桥的网盘不好用"}
1.7.4 查询
GET goods/_search
{
  "query": {
    "match": {
      "content": "caozuo"
    }
  },
  "highlight": {
    "pre_tags": "<em>",
    "post_tags": "</em>",
    "fields": {
      "content": {}
    }
  }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!