1、docker pull elasticsearch:7.11.1
2、docker pull kibana:7.11.1
版本要一致
3、demo数据地址:https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json
4、mkdir -p /data/elasticsearch/config
mkdir -p /data/elasticsearch/data
chmod -R 777 /data/elasticsearch/
5、echo "http.host: 0.0.0.0" >/data/elasticsearch/config/elasticsearch.yml
#设置任何主机均可访问
6、启动elastic
docker run --name elasticsearch711 -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.11.1
此时访问主机9200端口即可看到elasticsearch可以访问
7、设置开机启动
docker update elasticsearch711 --restart=always
8、启动kibana
docker run --name kibana711 -e ELASTICSEARCH_HOSTS=http://192.168.3.91:9200 -p 5601:5601 -d kibana:7.11.1
基础指令一
1、 GET /_cat/nodes 查看所有节点
访问: http://192.168.3.91:9200/_cat/nodes
输出: 127.0.0.1 31 96 8 0.62 0.39 0.28 cdhilmrstw * 2a01f779974e
* 代表是主节点, 2a01f779974e代表节点
2、GET /_cat/health 查看健康情况
3、GET /_cat/master 查看主节点
4、GET /_cat/indicie 查看所有索引
基础指令二
1、PUT 修改数据,必须指定id,没有就创建,有就修改
PUT consume/test1/1
{
"name":"zhangsan2"
}
2、POST 修改数据,
1、不指定id,自动生成id,创建新数据
2、指定id,没有就创建,有就修改
PUT consume/test1/2
{
"name":"zhangsi"
}
3、GET 查看文档
GET consume/test1/1
4、PUT http://192.168.3.91:9200/customer/external/1?if_seq_no=18&if_primary_term=6
#只有sql_no匹配时才修改
5、POST customer/test1/1/_update
{
"doc":{
"name":"111"
}
}
加了_update和doc,则只修改doc里面字段的内容,否则POST的修改是覆盖
6、删除文档、索引
DELETE customer/test1/1
DELETE customer
7、批量操作 bulk
POST customer/test1/_bulk
{"index":{"_id":"1"}}
{"name":"a"}
{"index":{"_id":"2"}}
{"name":"b"}
如果其中一条失败,另外一条会继续执行,两条数据之间是互相独立的
8、查询所有数据并排序
GET bank/_search?q=*&sort=account_number:asc
相当于
GET bank/_search
{
"query": {"match_all": {}},
"sort": [
{
"account_number": {
"order": "asc"
}
}
]
}
term和match的区别
term适合非分本字段,match适合文本字段GET /bank/_search
{
"query":{"match":{"address", "mill road"}}
}
GET /bank/_search
{
"query":{"match_phrase":{"address", "mill road"}}
}
GET /bank/_search
{
"query":{"match":{"address.keyword", "mill road"}}
}
match: 会对mill road进行分词查询,根据权重排序
match_phrase:不对mill road做分词,会在查找包含"mill road"整个词的address记录
text.keyword:不对mill road做分词,会在查找address="mill road"的记录
Query DSL(domain-specific language领域特定语言)
GET bank/_search
{
"query": {"match_all": {}},
"from": 0,
"size": 20,
"_source": ["account_number", "balance"],
"sort": [
{
"account_number": {
"order": "asc"
}
}
]
}
from 第几页
size 每页数据数
sort 排序
_source查询出的字段
1、match 匹配查询
a、在address字段中分词匹配,所有包含mill或road的都会被查出
最终会按照评分进行排序,会对检索条件进行分词匹配
GET bank/_search
{
"query": {
"match": {
"address": "mill road"
}
}
}
b、在address字段中全文匹配,address="Lane"的才会被查出
GET bank/_search
{
"query": {
"match": {
"address.keyword": "Lane"
}
}
}
c、match_phrase 短句匹配
将需要匹配的值当成一整个单词(不分词)进行检索,address中包含"mill road"整个词的才会被查出
GET bank/_search
{
"query": {
"match_phrase": {
"address": "mill road"
}
}
}
d、multi_match 多字段匹配,state或address中包含mill的都会被查出来
GET bank/_search
{
"query": {
"multi_match": {
"query": "mill",
"fields": ["state", "address"]
}
}
}
复合查询 boolean
- must:必须达到must所列举的所有条件
- must_not:必须不匹配must_not所列举的所有条件。
- should:应该满足should所列举的条件。满足条件最好,不满足也可以,满足得分更高
1、查询gender=m,并且address=mill的数据
GET bank/_search
{
"query":{
"bool":{
"must":[
{"match":{"address":"mill"}},
{"match":{"gender":"M"}}
]
}
}
}
2、查询gender=m,并且address=mill的数据,但是age不等于38的
GET bank/_search
{
"query":{
"bool":{
"must":[
{"match":{"address":"mill"}}
],
"must_not": [
{"match": {"age": 38}}
]
}
}
}
Filter结果过滤
上面的must和should影响相关性得分,而must_not仅仅是一个filter ,不贡献得分
must改为filter就使must不贡献得分
如果只有filter条件的话,我们会发现得分都是0
一个key多个值可以用terms
并不是所有的查询都需要产生分数,特别是哪些仅用于filtering过滤的文档。为了不计算分数,elasticsearch会自动检查场景并且优化查询的执行。
#查询age=32的人,再根据1000<balance<2000做过滤
GET bank/_search
{
"query": {
"bool": {
"must": [
{"match": {
"age": 32
}}
],
"filter": [
{"range": {
"balance": {
"gte": 1000,
"lte": 2000
}
}}
]
}
}
}
term 和match一样。匹配某个属性的值。
- 全文检索字段用match,
- 其他非text字段匹配用term(term不会对文本进行分词)
- 不要使用term来进行文本字段查询
Aggregation(聚合)
聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于SQL的Group by和SQL聚合函数。
在elasticsearch中,执行搜索返回this(命中结果),并且同时返回聚合结果,把以响应中的所有hits(命中结果)分隔开的能力。这是非常强大且有效的,你可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API避免网络往返。
#查出所有年龄分布,并且这些年龄段中M、F的平均薪资以及这个年龄段的总体平均薪资
#size 列出可能的记录条数
GET bank/_search
{
"query": {"match_all": {}},
"aggs": {
"ageAgg1": {
"terms": {
"field": "age",
"size": 100
},
"aggs": {
"genderAgg": {
"terms": {
"field": "gender.keyword",
"size": 10
},
"aggs": {
"balanceAgg": {
"avg": {
"field": "balance"
}
}
}
},
"agebalanceAgg":{
"avg":{
"field": "balance"
}
}
}
}
}
}
Mapping 映射定义文档如何被存储检索的
(1)字段类型
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/mapping-types.html
核心类型
复合类型
地理类型
特定类型核心数据类型
(1)字符串
text 用于全文索引,搜索时会自动使用分词器进行分词再匹配
keyword 不分词,搜索时需要匹配完整的值(2)数值型
整型: byte,short,integer,long
浮点型: float, half_float, scaled_float,double(3)日期类型: date
(4)范围型: integer_range, long_range, float_range,double_range,date_range
gt是大于,lt是小于,e是equals等于。
age_limit的区间包含了此值的文档都算是匹配。(5)布尔boolean
(6)二进制: binary 会把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
(7)复杂数据类型
(1)对象:object一个对象中可以嵌套对象。
(2)数组:Array(8)嵌套类型: nested 用于json对象数组
查看mapping信息:GET bank/_mapping