Elasticsearch 入门教程- 安装中文分词器(IK+pinyin)

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

本篇文章按照下面的内容进行描述:

   安装IK

    简单的测试

    模拟测试

    安装elasticsearch-analysis-pinyin

    简单的测试

    模拟测试

安装IK

    在github中下载相应的代码,比如我的最新版本2.5.2就没有对应的ik版本:

步骤:

1、在elasticsearch中安装ik中文分词器

(1)git clone https://github.com/medcl/elasticsearch-analysis-ik

(2)git checkout tags/v5.2.0

(3)mvn package

(4)将target/releases/elasticsearch-analysis-ik-5.2.0.zip拷贝到es/plugins/ik目录下

(5)在es/plugins/ik下对elasticsearch-analysis-ik-5.2.0.zip进行解压缩

(6)重启es

简单的测试

这里使用_analyze api对中文段落进行分词,测试一下:

GET _analyze{  "analyzer":"ik_max_word",  "text":"中华人民共和国国歌"}

可以看到ik尽可能多的切分的单词:

{
 "tokens": [
   {
     "token": "中华人民共和国",
     "start_offset": 0,
     "end_offset": 7,
     "type": "CN_WORD",
     "position": 0
   },
   {
     "token": "中华人民",
     "start_offset": 0,
     "end_offset": 4,
     "type": "CN_WORD",
     "position": 1
   },
   {
     "token": "中华",
     "start_offset": 0,
     "end_offset": 2,
     "type": "CN_WORD",
     "position": 2
   },
   {
     "token": "华人",
     "start_offset": 1,
     "end_offset": 3,
     "type": "CN_WORD",
     "position": 3
   },
   {
     "token": "人民共和国",
     "start_offset": 2,
     "end_offset": 7,
     "type": "CN_WORD",
     "position": 4
   },
   {
     "token": "人民",
     "start_offset": 2,
     "end_offset": 4,
     "type": "CN_WORD",
     "position": 5
   },
   {
     "token": "共和国",
     "start_offset": 4,
     "end_offset": 7,
     "type": "CN_WORD",
     "position": 6
   },
   {
     "token": "共和",
     "start_offset": 4,
     "end_offset": 6,
     "type": "CN_WORD",
     "position": 7
   },
   {
     "token": "国",
     "start_offset": 6,
     "end_offset": 7,
     "type": "CN_CHAR",
     "position": 8
   },
   {
     "token": "国歌",
     "start_offset": 7,
     "end_offset": 9,
     "type": "CN_WORD",
     "position": 9
   }
 ]
}

如果使用ik_smart,则会尽可能少的返回词语:

{
 "tokens": [
   {
     "token": "中华人民共和国",
     "start_offset": 0,
     "end_offset": 7,
     "type": "CN_WORD",
     "position": 0
   },
   {
     "token": "国歌",
     "start_offset": 7,
     "end_offset": 9,
     "type": "CN_WORD",
     "position": 1
   }
 ]
}


ik分词器的使用

PUT /my_index 

{

  "mappings": {

    "my_type": {

      "properties": {

        "text": {

          "type": "text",

          "analyzer": "ik_max_word"

        }

      }

    }

  }

}

POST /my_index/my_type/_bulk

{ "index": { "_id": "1"} }

{ "text": "男子偷上万元发红包求交女友 被抓获时仍然单身" }

{ "index": { "_id": "2"} }

{ "text": "16岁少女为结婚“变”22岁 7年后想离婚被法院拒绝" }

{ "index": { "_id": "3"} }

{ "text": "深圳女孩骑车逆行撞奔驰 遭索赔被吓哭(图)" }

{ "index": { "_id": "4"} }

{ "text": "女人对护肤品比对男票好?网友神怼" }

{ "index": { "_id": "5"} }

{ "text": "为什么国内的街道招牌用的都是红黄配?" }

GET /my_index/_analyze

{

  "text": "男子偷上万元发红包求交女友 被抓获时仍然单身",

  "analyzer": "ik_max_word"

}

GET /my_index/my_type/_search 

{

  "query": {

    "match": {

      "text": "16岁少女结婚好还是单身好?"

    }

  }

}

安装elasticsearch-analysis-pinyin分词器

pinyin分词器可以让用户输入拼音,就能查找到相关的关键词。比如在某个商城搜索中,输入shuihu,就能匹配到水壶。这样的体验还是非常好的。

pinyin分词器的安装与IK是一样的,这里就省略掉了。下载的地址参考github.

这个分词器在1.8版本中,提供了两种分词规则:

pinyin,就是普通的把汉字转换成拼音;

pinyin_first_letter,提取汉字的拼音首字母

简单的测试

首先创建索引,并创建分词器:

PUT medcl
{
  "index" : {
        "analysis" : {
            "analyzer" : {
                "pinyin_analyzer" : {
                    "tokenizer" : "my_pinyin",
                    "filter" : "word_delimiter"
                    }
            },
            "tokenizer" : {
                "my_pinyin" : {
                    "type" : "pinyin",
                    "first_letter" : "none",
                    "padding_char" : " "
                }
            }
        }
    }
}

然后使用analyze api,进行测试

GET medcl/_analyze{  "text":"刘德华",  "analyzer":"pinyin_analyzer"}

可以得到结果:

{
 "tokens": [
   {
     "token": "liu",
     "start_offset": 0,
     "end_offset": 3,
     "type": "word",
     "position": 0
   },
   {
     "token": "de",
     "start_offset": 0,
     "end_offset": 3,
     "type": "word",
     "position": 1
   },
   {
     "token": "hua",
     "start_offset": 0,
     "end_offset": 3,
     "type": "word",
     "position": 2
   }
 ]
}

如果分词器设置为pinyin_first_letter,则分析的结果为:

{
 "tokens": [
   {
     "token": "ldh",
     "start_offset": 0,
     "end_offset": 3,
     "type": "word",
     "position": 0
   }
 ]
}

模拟测试

如果索引已经存在,需要先关闭索引

POST medcl/_close{
 
}

然后设置分词器配置

PUT medcl/_settings 
{
  "index" : {
        "analysis" : {
            "analyzer" : {
                "pinyin_analyzer" : {
                    "tokenizer" : "my_pinyin",
                    "filter" : ["word_delimiter","nGram"]
                }
            },
            "tokenizer" : {
                "my_pinyin" : {
                    "type" : "pinyin",
                    "first_letter" : "prefix",
                    "padding_char" : " "
                }
            }
        }
    }
}

打开索引

POST medcl/_open{
 
}

定义映射类型

POST medcl/folks/_mapping
{
  "folks": {
        "properties": {
            "name": {
                "type": "multi_field",
                "fields": {
                    "name": {
                        "type": "string",
                        "store": "no",
                        "term_vector": "with_positions_offsets",
                        "analyzer": "pinyin_analyzer",
                        "boost": 10
                    },
                    "primitive": {
                        "type": "string",
                        "store": "yes",
                        "analyzer": "keyword"
                    }
                }
            }
        }
    }
}

提交样例数据

POST medcl/folks/1{  "name":"刘德华"}

执行查询

GET medcl/folks/_search
   { "query": 
       {"match": 
       {   "name": "l d hua" }
    }
}

这里搜liu de hua,ldh,l de hua都能匹配到,还是很强大滴。

得到结果

{
 "took": 7,
 "timed_out": false,
 "_shards": {
   "total": 5,
   "successful": 5,
   "failed": 0
 },
 "hits": {
   "total": 1,
   "max_score": 7.408082,
   "hits": [
     {
       "_index": "medcl",
       "_type": "folks",
       "_id": "1",
       "_score": 7.408082,
       "_source": {
         "name": "刘德华"
       }
     }
   ]
 }
}

参考链接:

  https://www.cnblogs.com/xing901022/p/5910139.html