es索引762(分词)

ElasticSearch(六):IK分词器的安装与使用IK分词器创建索引
Elasticsearch之中文分词器插件es-ik(博主推荐)

如何在Elasticsearch中安装中文分词器(IK+pinyin)

之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了

一、分词器elasticsearch-analysis-ik

  1. ik分词器的下载和安装,测试
    第一: 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases ,这里你需要根据你的Es的版本来下载对应版本的IK,这里我使用的是6.3.2的ES,所以就下载ik-6.3.2.zip的文件。

1. 分词类型

分词类型描述
“analyzer”:“ik_smart”汉语分成一个个的词
“analyzer”:“ik_max_word”汉语分成一个个的词

对于上面两个分词效果的解释:

  1. 如果未安装ik分词器,那么,你如果写 “analyzer”: “ik_max_word”,那么程序就会报错,因为你没有安装ik分词器

  2. 如果你安装了ik分词器之后,你不指定分词器,不加上 “analyzer”: “ik_max_word” 这句话,那么其分词效果跟你没有安装ik分词器是一致的,也是分词成每个汉字。

如果直接使用Elasticsearch的朋友在处理中文内容的搜索时,肯定会遇到很尴尬的问题——中文词语被分成了一个一个的汉字,当用Kibana作图的时候,按照term来分组,结果一个汉字被分成了一组。

这是因为使用了Elasticsearch中默认的标准分词器,这个分词器在处理中文的时候会把中文单词切分成一个一个的汉字,因此引入中文的分词器就能解决这个问题。

一、分词器的作用

1.1 分词器的作用

分词顾名思义,就是把一句话分成一个一个的词。这个概念在搜索中很重要,比如 This is a banana. 如果按照普通的空格来分词,分成this,is,a,banana,的出来的a其实对我们并没有什么用处。因此需要注意下面的问题:

  • 1 区分停顿词(a,or,and这种都属于停顿词)
  • 2 大小写转换(Banana与banana)
  • 3 时态的转换…

具体的算法可以参考http://tartarus.org/~martin/PorterStemmer/,对照的词语可以参考这里http://snowball.tartarus.org/algorithms/porter/diffs.txt

相比中文,就复杂的度了。因为中文不能单纯的依靠空格,标点这种进行分词。就比如中华人民共和国国民,不能简单的分成一个词,也不能粗暴的分成中华人民共和国和国民,人民、中华这些也都算一个词!

因此常见的分词算法就是拿一个标准的词典,关键词都在这个词典里面。然后按照几种规则去查找有没有关键词,比如:

  • 正向最大匹配(从左到右)
  • 逆向最大匹配(从右到左)
  • 最少切分
  • 双向匹配(从左扫描一次,从右扫描一次)

IK,elasticsearch-analysis-ik提供了两种方式

  • ik_smart就是最少切分,
  • ik_max_word则为细粒度的切分(可能是双向,没看过源码)

在这里插入图片描述

在这里插入图片描述

了解了分词器的背景后,就可以看一下如何在Elasticsearch重安装分词器了。

三、创建索引

3.1 创建指定分词器的索引

索引创建之后就可以使用ik进行分词了,当你使用ES搜索的时候也会使用ik对搜索语句进行分词,进行匹配。


GET _search
{
  "query": {
    "match_all": {}
  }
}

POST _analyze
{
  "analyzer":"standard",
  "text":"我是中国人"
}

POST _analyze
{
  "text":"我是中国人"
}

















POST _analyze
{
  "analyzer":"ik_smart",
  "text":"我是中国人"
}



















POST _analyze
{
  "analyzer":"ik_max_word",
  "text":"我是中国人"
}


POST _analyze
{
  "analyzer":"ik_smart",
  "text":"我是程序员"
}


# 新增索引库
PUT /user

# 获取所有索引库信息
GET _cat/indices

# 删除索引库
DELETE /user





# 添加映射
PUT /user/_mapping
{
  "properties": {
    "name": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart", 
      "store": false
    },
    "city": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart", 
      "store": false
    },
    "age": {
      "type": "long",
      "store": false
    },
    "description": {
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart", 
      "store": false
    }
  }
}

# 添加文本数据 id=1
POST /user/_doc/1
{
  "name": "张三",
  "city": "上海",
  "age": 20,
  "description": "张三是一名是中国上海人"
}


# 添加文本数据 id=2
PUT /user/_doc/2
{
  "name": "李四",
  "city": "北京",
  "age": 25,
  "description": "李四到北京实习"
}


# 根据 ID 查询数据 id=2
GET /user/_doc/2

# 更新文本数据 id=2 (原理: 删除原始数据, 新增数据)
PUT /user/_doc/2
{
  "age": 30,
  "description": "李四在北京工作"
}

# 更新数据, 直接修改指定域的数据.
POST /user/_doc/2/_update
{
  "doc": {
    "age": 45,
    "description": "李四在北京工作, 当上 CEO."
  }
}

# 查询索所有数据
GET _search

# 查询索引库所有数据
GET /user/_search

# 查询索引库下文档所有数据
GET /user/_doc/_search

# 根据 age 降序排列
GET /user/_doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

# 分页查询
GET /user/_doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值