ElasticSearch学习笔记(4)-IK中文分词器

一、分词器-介绍

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包
•是一个基于Maven构建的项目
•具有60万字/秒的高速处理能力
•支持用户词典扩展定义
•下载地址: https://github.com/medcl/elasticsearch-analysis-ik/

 

二、ik分词器使用


IK分词器有两种分词模式:ik_max_word和ik_smart模式。


1、ik_max_word


会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、
冠军。

 

#方式一ik_max_word
GET /_analyze
{
 "analyzer": "ik_max_word",
 "text": "乒乓球明年总冠军"
}

ik_max_word分词器执行如下

{
 "tokens" : [
 {
   "token" : "乒乓球",
   "start_offset" : 0,
   "end_offset" : 3,
   "type" : "CN_WORD",
   "position" : 0
 },
 {
   "token" : "乒乓",
   "start_offset" : 0,
   "end_offset" : 2,
   "type" : "CN_WORD",
   "position" : 1
 },
 {
   "token" : "",
   "start_offset" : 2,
   "end_offset" : 3,
   "type" : "CN_CHAR",
   "position" : 2
 },
 {
   "token" : "明年",
   "start_offset" : 3,
   "end_offset" : 5,
   "type" : "CN_WORD",
   "position" : 3
 },
 {
   "token" : "总冠军",
   "start_offset" : 5,
   "end_offset" : 8,
   "type" : "CN_WORD",
   "position" : 4
 },
 {
   "token" : "冠军",
   "start_offset" : 6,
   "end_offset" : 8,
   "type" : "CN_WORD",
   "position" : 5
 }
]
}

 

2、ik_smart


会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

#方式二ik_smart
GET /_analyze
{
 "analyzer": "ik_smart",
 "text": "乒乓球明年总冠军"
}

ik_smart分词器执行如下:

{
 "tokens" : [
 {
   "token" : "乒乓球",
   "start_offset" : 0,
   "end_offset" : 3,
   "type" : "CN_WORD",
   "position" : 0
 },
 {
   "token" : "明年",
   "start_offset" : 3,
   "end_offset" : 5,
   "type" : "CN_WORD",
   "position" : 1
 },
 {
   "token" : "总冠军",
   "start_offset" : 5,
   "end_offset" : 8,
   "type" : "CN_WORD",
   "position" : 2
 }
]
}

由此可见 使用ik_smart可以将文本"text": "乒乓球明年总冠军"分成了【乒乓球】【明年】【总冠军】
这样看的话,这样的分词效果达到了我们的要求。

 

三、使用IK分词器-查询文档


•词条查询:term


词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索


•全文查询:match


全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集。


1.创建索引,添加映射,并指定分词器为ik分词器

PUT person2
{
 "mappings": {
  "properties": {
   "name": {
    "type": "keyword"
  },
   "address": {
    "type": "text",
    "analyzer": "ik_max_word"
  }
 }
}
}

2.添加文档

POST /person2/_doc/1
{
"name":"张三",
"age":18,
"address":"北京市的海淀区"
}
POST /person2/_doc/2
{
"name":"李四",
"age":18,
"address":"北京市朝阳区"
}
POST /person2/_doc/3
{
"name":"王五",
"age":18,
"address":"北京市的¥¥¥¥昌平区"
}

3.查询映射

GET person2/_search

 

 4.查看分词效果

GET _analyze
{
   "analyzer": "ik_max_word",
   "text": "北京海淀"
}

 

 

5.词条查询:term


查询person2中匹配到"北京"两字的词条

GET /person2/_search
{
 "query": {
  "term": {
   "address": {
    "value": "北京"
  }
 }
}
}

 

 

 GET /person2/_search
{
 "query": {
  "term": {
   "address": {
    "value": "北京昌平"
  }
 }
}
}

这个查不到数据。

 

 

6.全文查询:match
全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集

GET /person2/_search
{
"query": {
 "match": {
  "address":"北京昌平"
 }
}
}

 

 

 

 

 

 

 

GET /person2/_search
{
"query": {
"match": {
"address":"北京 区"
}
}
}

 

posted @ 2022-12-18 16:45  沐雪架构师  阅读(389)  评论(0编辑  收藏  举报