接 ElasticSearch服务集群搭建以及应用(一)
一:ES单机测试及快速入门
1.创建索引库
ES作为一个搜索服务,对外提供了丰富的Restful接口进行操作,head是ES的可视化管理插件,索引库是一个逻辑概念,它包括了分词列表和文档列表,同一个索引库中存储相同类型的文档,它相当于mysql的表.
(1)使用postman创建索引库 , API如下
put类型 http://localhost:9200/索引库名称
Json参数:
{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
number_of_shards:
设置分片的数量,在集群中通常设置多个分片,表示一个索 引库将拆分成多片分别存储不同的结点,提高了ES的处理能力和高可用性, 入门程序使用单机环境,这里设置为1。
number_of_replicas:
设置副本的数量,设置副本是为了提高ES的高可靠性, 单机环境设置为0.
创建的结果如下,表示创建成功 :
(2)使用head可视化界面创建索引库
点击head页面上的索引–>新建索引,输入索引名称,分片数,副本数。
2.创建映射
索引中每一个文档(Document)都包含一个或者多个field,创建映射就是向索引库创建field的过程,document和field的类比关系和关系型数据库类比如下:
类型(type)-----table表记录(ES9.0之后会彻底删除)
文档(Document)------Row行记录
字段(field)-----columns列记录
ES官方建议,在一个索引库中只存储同一类型的文档
(1)创建映射ES提供的API如下
post http://localhost:9200/索引库名称/(类型名称)/_mapping
(2)在索引库es_course里面,创建3个映射,分别是name,description,studymodel,ES6版本没有删除类型名称,所以给一个没有意义的名称即可,这里给doc,在postman发请求如下:
(3)在head页面上显示的内容如下:
3.创建文档
(1)创建文档ES提供的API如下
put 或Post http://localhost:9200/索引库名称/(类型名称)/id值
(如果不指定id值ES会自动生成ID)
(2)测试生成文档如下,不指定id
(3) 在head页面上显示效果如下:
4.搜索文档
(1)根据id搜索文档
get http://localhost:9200/索引库名称/(类型名称)/id
(2)查询所有记录
get http://localhost:9200/索引库名称/(类型名称)/_search
(3)查询名称中包括开发关键字的的记录
get http://localhost:9200/索引库名称/(类型名称)/_search?q=name:开发
(4)查询学习模式为201001的记录
get http://localhost:9200/索引库名称/(类型名称)/_search?q=studymodel:201001
took:本次操作花费的时间,单位为毫秒。
timed_out:请求是否超时
_shards:说明本次操作共搜索了哪些分片
hits:搜索命中的记录
hits.total : 符合条件的文档总数 hits.hits :匹配度较高的前N个文档
hits.max_score:文档匹配得分,这里为最高分
_score:每个文档都有一个匹配度得分,按照降序排列。
_source:显示了文档的原始内容。
二:IK分词器的使用
1.安装IK分词器
下载IK分词器 , 版本和ES版本保持一致 , 将解压的IK分词器中jar包所在的文件夹复制到ES安装包下的plugin目录下 , 并将该文件夹改为ik以便识别,重启ES服务
2.两种分词模式
ik分词器有两种分词模式:ik_max_word和ik_smart模式。
(1)ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、 华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
(2)ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
3.自定义词库
(1)复制到es的plugins目录下改名的ik目录下的config目录 , 有一个main.dic是自带的词库 , 但是我们还可以自定义词库 , 可以新建一个my.dic,一定注意文件格式设置为utf-8,把我们自定义的词语输进去
(2)然后在配置文件IKAnalyzer.cfg.xml中 , 在扩展字典那一行写上my.dic ,重启ES服务,自定义词库即可使用
(3)示例,如下自带词库没有的词语,会被分割成一个个的字
(4)如果把这个词语添加到自定义词典中,再分词的效果如下
三:映射的维护
1.映射维护的方法
(1)查询所有索引的映射:
GET: http://localhost:9200/_mapping
(2)创建映射
post 请求:http://localhost:9200/索引库名称/(类型名称)/_mapping
{
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"studymodel": {
"type": "keyword"
}
}
}
(3)更新映射
映射创建成功可以添加新字段,已有字段不允许更新。
(4)删除映射
通过head页面删除索库引来删除映射。
2.映射常用的类型
(1)text类型
对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。
index表示是否索引,默认为true,例如商品的图片地址pic,我们不会根据图片地址搜索,索引pic没有必要索引,就设置为false。
"name": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart",
“index”:false
}
(2)keyword类型
keyword字段为关键字字段,通常搜索keyword是按照整体搜
索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。进行精准查询 。
(3)date日期类型
日期类型不用设置分词器,只用设置format来确定日期格式
{
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd"
}
}
}
(4)数值类型
Long,integer,short,byte,double,float,harf_float,scaled_float
①尽量选择范围小的类型,提高搜索效率
②对于浮点数尽量用比例因子,比如一个价格字段,单位为元,我们将比例因子设置为100这在ES中会按分存储,映射如下:
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
由于比例因子为100,如果我们输入的价格是23.45则ES中会将23.45乘以100存储在ES中。
如果输入的价格是23.456,ES会将23.456乘以100再取一个接近原始值的数,得出2346。
③使用比例因子的好处是整型比浮点型更易压缩,节省磁盘空间。
3.综合创建索引的例子
{
"properties": {
"description": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"name": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
},
"pic":{
"type":"text",
"index":false
},
"price": {
"type": "float"
},
"studymodel": {
"type": "keyword"
},
"timestamp": {
"type": "date",
"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd"
}
}
}