ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ES入门

2019-10-22 10:57:28  阅读:223  来源: 互联网

标签:end 入门 start token offset position type ES


ES入门概念简介

  • 索引库 index
  • type
  • 文档 document
  • 字段 filed

创建索引库

创建一个名为“index_test”的索引库:

  PUT/index_test

       http://localhost:9200/index_test

{
"settings":{
"number_of_shards":1, //索引库分片数量
"number_of_replicas":0 //每个分片的副本数,关于分片、集群等在后文详细介绍
}
}

创建mapping关系

 POST /index_name/type_name/_mapping

  http://localhost:9200/index_test/doc/_mapping

  

{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"integer"
},
"description":{
"type":"text"
}
}
}
添加文档

PUT /index/type/id

   如果不指定id,es会自动创建id

   这里不会做index校验,也就是说如果你写错了index,也会添加成功需要注意

http://localhost:9200/index_test/doc/
{
"name" : "许文祥",
"description" : "666666666666666666666666666666666666666666666666",
"age" : 27
}


IK中文分词器
ES默认情况下是不支持中文分词的,也就是说对于添加的中文数据,ES将会把每个字当做一个term(词项),这不利于中文检索。

  • es6之前方法是GET,如下:


http://localhost:9200/_analyze?analyzer=ik_smart&text=手机充值

  • es6之后可以使用GET或者POST方法,但是分词器和查询词需要以json的形式写在body里。


测试ES默认情况下对中文分词的结果:
POST /_analyze
http://localhost:9200/_analyze

 

analyzer为分词类型,可以不写默认:standard

{
"analyzer": "standard",
"text": "许文祥sfsafsf"
}

 

{
"tokens": [
{
"token": "许",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
},
{
"token": "文",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "祥",
"start_offset": 2,
"end_offset": 3,
"type": "<IDEOGRAPHIC>",
"position": 2
},
{
"token": "sfsafsf",
"start_offset": 3,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 3
}
]
}

这里可以看到中文被分成了一个字一个字
下载ik-6.4.0并解压到ES的plugins文件夹下
目录下,并将解压后的目录改名为 ik,重启ES,该插件即会被自动加载。

这里需要注意一个问题,ik的配置文件里会配指定的es版本,如果和你的es版本不一致,启动es的时候会报错


启动es的时候会一闪而过,只能去log里面取看日志
修改这个version=6.2.3之后就能启动了

{
"text":"中华人民共和国",
"analyzer":"ik_max_word" //设置分词器为ik分词器,否则还是会采用默认分词器,可选ik_max_word和ik_smart
}
{
"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
}
]
}

在输入"中华人民共和国"的时候可以看出ik中文分词的效果,但是在输入"许文祥sdfsf"的时候并不能看出效果原因是ik中文分词默认启用main.dic分词库,在config文件里可以看到.

自定义词库
自定义词库的编码格式需要是utf-8,否则会不启作用
我们在ES的目录下增加自定义的词库文件extra_my.dic

/plugins/ik/config


并添加两行行“许文祥 文祥”(词典文件的格式是每一个词项占一行),并在ik的配置文件中引入该自定义词典:

/plugins/ik/config/IKAnalyzer.cfg.xml

这次再去测试中文分词就会根据自己词库进行分词

{
"tokens": [
{
"token": "许文祥",
"start_offset": 0,
"end_offset": 3,
"type": "CN_WORD",
"position": 0
},
{
"token": "文祥",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 1
}
]
}

映射
新增字段
PUT /xc_course/doc/_mapping

http://localhost:9200/index_test/doc/_mapping

{
"properties":{
"create_time":{
"type":"date"
}
}
}

查看映射
GET /index/doc/_mapping

http://localhost:9200/index_test/doc/_mapping

{
"index_test": {
"mappings": {
"doc": {
"properties": {
"age": {
"type": "integer"
},
"create_time": {
"type": "date"
},
"description": {
"type": "text"
},
"name": {
"type": "text"
}
}
}
}
}
}

已有的映射可以新增字段但不可以更改已有字段的定义!

如果一定要更改某字段的定义(包括类型、分词器、是否索引等),那么只有删除此索引库重新建立索引并定义好各字段,再迁入数据。因此在索引库创建时要考虑好映射的定义,因为仅可扩展字段但不可重新定义字段。

{
"properties":{
"create_time":{
"type":"integer"
}
}
}
这边就会报错
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "mapper [create_time] of different type, current_type [date], merged_type [integer]"
}
],
"type": "illegal_argument_exception",
"reason": "mapper [create_time] of different type, current_type [date], merged_type [integer]"
},
"status": 400
}
 

标签:end,入门,start,token,offset,position,type,ES
来源: https://www.cnblogs.com/xwx20160804/p/11718322.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有