Elasticsearch提供了Rest风格的API,即http请求接口
2.1基本概念
Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的。
索引库(indices):indices是index的复数,代表许多的索引
类型(type):类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念
文档(document):存入索引库原始的数据。比如每一条商品信息,就是一个文档
字段(field):文档中的属性
映射配置(mappings):字段的数据类型、属性、是否索引、是否存储等特性
官网
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/index.html
2.2索引操作
2.2.1创建索引:put请求
使用kibana创建索引
请求方式:PUT
请求路径:索引库名
请求参数:json格式
put book
{
"settings":{
"number_of_shards":1, /*分片数量*/
"number_of_replicas":0 /*副本数量*/
}
}
number_of_shards 是指索引要做多少个分片,只能在创建索引时指定,后期无法修改。
number_of_replicas 是指每个分片有多少个副本,后期可以动态修改
什么是分片?
ES中所存数据的文件块,也是数据的最小单元块。假如有2个分片,插入10条数据,默认,每个分片存5条。
2.2.2查看索引:get请求
get 索引库名
2.2.3删除索引:delete请求
delete 索引库名
2.3映射配置
创建索引库,就相当于mysql创建“数据库”。接着我们来配置映射,相当于mysql创建“表结构”。
在ElasticSearch中,我们常配置:
字段的数据类型
是否要存储
是否要索引
是否分词
分词器是什么
2.3.1创建映射关系
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
类型名称:基本概念中所说的type,类似于数据库中的表
字段名:类似于数据库中的列名。
type:类型,可以是text、keyword、long、short、date、integer、object等
index:是否索引,默认为true
store:是否存储,默认为false
analyzer:分词器,这里的ik_max_word
即使用ik分词器
/* 1.先创建索引 */
put czxy
/* 2.创建映射关系 */
put czxy/_mapping/book
{
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"images": {
"type": "keyword",
"index": "false"
},
"price": {
"type": "float"
}
}
}
2.3.2查看映射关系
GET /索引库名/_mapping
2.3.3字段属性详解
1)type
Elasticsearch中支持的数据类型非常丰富
String类型,又分两种:
text修饰字符串,默认进行分词,并生成索引。不能用来过滤、排序和聚合等操作。
keyword修饰字符串,不会分词,不会建立索引。常常被用来过滤、排序和聚合。
Numerical:数值类型,分两类
基本数据类型:long、interger、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
2)index
index影响字段的索引情况。
true:字段会被索引,则可以用来进行搜索。默认值就是true
false:字段不会被索引,不能用来搜索
index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
3)store
是否将数据进行额外存储。
Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source
的属性中。而且我们可以通过过滤_source
来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source
以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。
2.4数据操作
2.4.1添加数据
语法:没有id
POST _index/_type/
{
"属性": "值",
....
}
实例
POST czxy/book/
{
"title": "标题",
"price": 1234
}
2.4.2添加或更新数据
语法:数据存在更新;如果不存在添加(指定id)
PUT _index/_type/_id
{
"属性": "值",
....
}
实例
PUT czxy/book/b001
{
"title": "标题123",
"price": 1234
}
2.4.3删除数据
语法:
DELETE _index/_type/_id
实例
DELETE czxy/book/b001
2.5查询操作
2.5.1简单查询
指定id查询
GET czxy/book/b001
指定id查询,检索指定内容
GET czxy/book/b001?_source=title,price
2.5.2高级查询
准备数据
PUT czxy2
PUT czxy2/_mapping/user
{
"properties": {
"username": {
"type": "text",
"analyzer": "ik_max_word"
},
"city": {
"type": "keyword"
},
"age": {
"type": "float"
}
}
}
PUT czxy2/user/u001
{
"username": "张三",
"city": "山西",
"age": 18
}
PUT czxy2/user/u002
{
"username": "张四",
"city": "山东",
"age": 20
}
PUT czxy2/user/u003
{
"username": "张三三",
"city": "山东",
"age": 22
}
查询所有
match_all:检索所有的数据
GET _search
{
"query": {
"match_all": {}
}
}
查询指定索引的所有
GET czxy2/_search
{
"query": {
"match_all": {}
}
}
查询部分结果
GET czxy2/_search
{
"query": {
"match_all": {}
},
"_source": ["username","city"]
}
条件查询:匹配查询
GET czxy2/_search
{
"query": {
"match": {
"username": "张三"
}
}
}
条件查询:复合查询(多条件查询)
bool:多条件拼接
must:必须
must_not:不含
should:可有可无
GET czxy2/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "山东"
}
}
],
"must_not": [
{
"match": {
"age": 22
}
}
]
}
}
}
should并集查询
注意:must和should同时存在的时候,should将会变得不起作用
GET czxy2/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"city": "山东"
}
},
{
"match": {
"city": "山西"
}
}
]
}
}
}
精确匹配
term 进行精确匹配(数据要求:数字、日期、布尔、not_analyzed的字符串(未分词))
GET czxy2/_search
{
"query": {
"term": {
"age": 2
}
}
}
范围查询
range 用于确定范围,gt 大于、lt 小于、gte大于等于、lte小于等于
ET czxy2/_search
{
"query": {
"range": {
"age": {
"gte": 19,
"lte": 21
}
}
}
}
排序
GET czxy2/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分页查询
from 设置索引号,从0开始
size 设置每页个数
GET czxy2/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 1
}