目的
1.学习elasticsearch初体验,更快了解elasticsearch的魅力
2.作为日常开发操作elasticsearchAPI的参考
常用API
IK分词器
即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把 数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词是将每个字看成一个词。有时我们就要搜索固定一个词组,比如"我爱学习";如果不用分词器,就会拆分为"我"、"爱"、"学"、"习"这种或类似的情况,显然不是我们想要的,所以需要使用中文分词器IK来解决。
IK提供了两个分词算法:ik_smart和ik_max_word,其中ik_smart为最少切分、ik_max_word为最细粒度划分
GET _analyze
{
"analyzer": "ik_smart",
"text": "我爱学习"
}
#IK分词器算法 最细粒度划分
GET _analyze
{
"analyzer": "ik_max_word",
"text": "我爱学习"
}
创建索引
# 方式一:直接创建索引,默认分片和备份数量为1
PUT test1
# 方式二:创建索引,设置分片数量为5、备份数量为1
PUT test2
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 5
}
}
# 方式三:创建索引,设置分片数量为5、备份数量为1, 同时设置关系型结构,类似表结构,分片和备份可不设置,有默认值
PUT test3
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 5
},
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"birthday": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
}
删除索引
DELETE test1
查看索引
GET test1
插入文档数据
#(/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id})
#方式一: put方式必须指明id
PUT test1/_doc/1
{
"name":"狂神说",
"age":3
}
#方式二: id选填,不指明时采用uuid
POST test3/_doc
{
"name":"狂神说22",
"age":311
}
#方式四:
PUT test1/_create/2
{
"name":"狂神说",
"age":3
}
PUT test3/_create/2
{
"name":"狂神说22",
"age":3,
"birthday":"1997-02-01"
}
删除文档
DELETE test1/_doc/1
修改文档数据
# 方式一: put请求,全覆盖存在id的数据,故如name不传值时,会将name置空,如果id不存在则为新增
PUT test1/_doc/1
{
"name":"狂神说",
"age":3
}
# 方式二: post请求,全覆盖存在id的数据,故如name不传值时,会将name置空,如果id不存在则为新增
POST test3/_doc/1
{
"name":"狂神说22",
"age":311
}
# 方式三: post请求, 按指定id修改指定字段,该方法已过时
POST test3/_doc/1/_update
{
"doc":{
"name": "狂神说33"
}
}
# 方式四: post请求, 按指定id修改指定字段, 推荐
POST test3/_update/1
{
"doc":{
"name": "狂神说3657573"
}
}
基本查询
# 方式一: 最简单的查询
GET test3/_doc/1
# 方式二: 查询索引全部数据
GET test1/_search
{
"query": {
"match_all": {}
}
}
# 方式三: 查询索引指定字段数据
GET test1/_search
{
"query": {
"match_all": {}
},
"_source": ["name"]
}
# 方式四: 查询索引指定字段数据
#匹配含有name的文档数据,如果name的类型为keyword不会走分词器解析
#match是会使用分词器解析的
GET test1/_search
{
"query": {
"match": {
"name": "狂神说"
}
}
}
#方式五:term直接精确查询,通过倒排索引查询,效率高
GET test1/_search
{
"query": {
"match": {
"age": "3"
}
}
}
复杂查询
#排序
GET test1/_search
{
"query": {
"match": {
"name": "狂神说"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
#分页
GET test1/_search
{
"query": {
"match": {
"name": "狂神说"
}
},
"sort": [
{
"age": {
"order": "desc"
}
}
],
"from": 0,
"size": 2
}
#布尔值查询
# must(and),所有的条件都要符合
GET test3/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "狂神说3657573"
}
},
{
"term": {
"age": "311"
}
}
]
}
}
}
# should(or), 满足一个条件即可
GET test3/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "狂神说3657573"
}
},
{
"term": {
"age": "3"
}
}
]
}
}
}
# must_not (not) 不等于
GET test3/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "狂神说3657573"
}
},
{
"term": {
"age": "3"
}
}
]
}
}
}
#过滤器filter gt 大于 gte 大于等于 lt 小于 lte 小于等于!
GET test3/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "狂神说3657573"
}
},
{
"term": {
"age": "3"
}
}
],
"filter": {
"range": {
"age": {
"gte": 1,
"lte": 20
}
}
}
}
}
}
高亮查询
GET test1/_search
{
"query": {
"match": {
"name": "狂神说"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
#自定义高亮
GET test1/_search
{
"query": {
"match": {
"name": "狂神说"
}
},
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}