1. 在docker中安装es
安装docker-compose详见附件
docker-compose up -d //控制台启动es -d后台启动
2. 简单集群管理
-
快速检查集群的健康状况
GET /_cat/health?v
集群健康情况.png status状态枚举的含义:
- green:每个索引的primary shard和replica shard都是active
- yellow:每个索引的primary shard都是active,但是部分replica shard不是active,处于不可用状态
- red:不是所有索引的primary shard都是active的,部分索引有数据丢失。
- 快速查看集群中有哪些索引
GET /_cat/indices?v - 简单的索引操作
创建索引:PUT /test_index?pretty
删除索引:DELETE /test_index?pretty
商品的CRUD操作
1)新增商品:新增文档,建立索引
put /index/type/id
put /ecommerce/product/1
{
"name":"gaolujie yagao",
"desc":"gaolujie meibai",
"price":30,
"producer":"gaolujie producer",
"tag":["meibai","fanzhu"]
}
put /ecommerce/product/2
{
"name":"jiajeishi yagao",
"desc":"youxiao fangzhu",
"price":25,
"producer":"jiajieshi producer",
"tag":["fanzhu"]
}
put /ecommerce/product/3
{
"name":"zhonghau yagao",
"desc":"caoben zhiwu",
"price":40,
"producer":"zhonghua producer",
"tag":["qingxin"]
}
es会自动建立index和type,不需要提前建立,而且es默认会对document每个field都建立倒排索引,让其可以被搜索
2)查询商品:检索文档
GET /index/type/id
GET /ecommerce/product/3
3)修改商品:替换文档
put /ecommerce/product/3
{
"name":"zhonghau yagao",
"desc":"caoben zhiwu",
"price":40,
"producer":"zhonghua producer",
"tag":["qingxin"]
}
文档内容必须全部带上
4)修改商品:更新文档
put /ecommerce/product/3/_update
{
"doc":{
"name":"zhonghau yagao",
}
}
更新传递的部分字段
5)删除商品:删除文档
DELETE /ecommerce/product/3?pretty
多种数据检索
1)query string search
由来:query string search是因为参数都是以http请求的query string来附带的
搜索全部商品:GET /ecommerce/product/_search
搜索商品名称中包含yaogao的商品,而且按照收件降序排序:GET /ecommerce/product/_search?q=name:yagao^sort=price:desc。在生产环境中,几乎很少使用query string search。
took:耗费了几毫秒
time_out:是否超时
_shard:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或对应它某个的replica shard也可以)
hits.total:查询结果数量,3个document
max_score:docuemnt对于一个search的的相关度的匹配分数,越相关,就越匹配,分数也就越高
hits.hits:包含了匹配搜索的document的详细数据
2)query DSL
DSL:Domain SPecified language 特定领域的语言
http request body:请求体,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search肯定强大多了
更加适合生产环境查询
GET /ecommerce/product/_search
-- 查询所有商品
{
"query":{
"macch_all":{}
}
}
-- 查询名字中包含yagao,同时按照价格降序
{
"query":{
"match":{
"name":"yagao"
}
},
"sort":[
{"prce":"desc"}
]
}
-- 查询全部,分页查询,from从哪个商品开始查(从0开始),size查询多少条
{
"query":{
"macch_all":{}
},
"from":1,
"size":2
}
-- 查询全部的商品的名称和价格
{
"query":{
"macch_all":{}
},
"_spurce":["name","price"]
}
3)query filter
查询名字包含yagao,价格大于25的商品
GET /ecommerce/product/_search
{
"query":{
"bool":{
"must":{
"match":{
"name":"yagao"
}
},
"filter":{
"range":{
"price":{
"gt":25
}
}
}
}
}
}
4)full-text query 全文检索
会对输入的字符进行拆解,建立倒排索引。按照score排分进行降序输出
GET /ecomerce/product/_search
{
"query":{
"match":{
"producer":"yagao producer"
}
}
}
5)phrase query 短语搜索
跟全文索引相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面意义匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。phrase search:要求输入的搜索串,必须在指定的字段中,完全包含一模一样的,才能算匹配,才能作为结果返回
GET /ecomerce/product/_search
{
"query":{
"match_phrase":{
"producer":"yaogao producer"
}
}
}
6)highlight search 高亮搜索结果
GET /ecomerce/product/_search
{
"query":{
"match_phrase":{
"producer":"yagao producer"
}
},
"highlight":{
"fields":{
"producer":{}
}
}
}
聚合分析
1)计算每个tag下的商品数量
"size":0, 不需要输出原source信息
GET /ecomerce/product/_search
{
"size":0,
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
}
}
}
}
0)将文本field的fielddata属性设置为true
PUT /ecommerce/_mapping/product
{
"properties":{
"tags":{
"type":"string",
"fielddata":true
}
}
}
2)搜索+聚合
GET /ecomerce/product/_search
{
"size":0,
"query":{
"match":{
"name":"yagao"
}
},
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
}
}
}
}
3)先分组,再算每组的平均值,计算每个tag下的平均商品价格
GET /ecomerce/product/_search
{
"size":0,
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
},
"aggs":{
"avg_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
4)先分组,再算每组的平均值,计算每个tag下的平均商品价格,按照平均价格降序输出
GET /ecomerce/product/_search
{
"size":0,
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags",
"order":{
"avg_price":"desc"
}
},
"aggs":{
"avg_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
5)按照指定的价格范围进行分组,然后在每组内再按照tag进行分组,最后再计算魅族的平均价格
GET /ecomerce/product/_search
{
"size":0,
"aggs":{
"group_by_price":{
"terms":{
"field":"price",
"ranges":[
{"from":0,"size":20},
{"from":20,"size":40},
{"from":40,"size":50},
]
},
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
},
"aggs":{
"average_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
}
}
附录
version: '2.2'
services:
cerebro:
image: lmenezes/cerebro:0.8.3
container_name: cerebro
ports:
- "9000:9000"
command:
- -Dhosts.0.host=http://elasticsearch:9200
networks:
- es7net
kibana:
image: docker.elastic.co/kibana/kibana:5.0.0
container_name: kibana7
environment:
- I18N_LOCALE=zh-CN
- XPACK_GRAPH_ENABLED=true
- TIMELION_ENABLED=true
- XPACK_MONITORING_COLLECTION_ENABLED="true"
ports:
- "5601:5601"
networks:
- es7net
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:5.0.0
container_name: es7_01
environment:
- cluster.name=geektime
- node.name=es7_01
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01,es7_02
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- es7net
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:5.0.0
container_name: es7_02
environment:
- cluster.name=geektime
- node.name=es7_02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01,es7_02
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data2:/usr/share/elasticsearch/data
networks:
- es7net
volumes:
es7data1:
driver: local
es7data2:
driver: local
networks:
es7net:
driver: bridge
网友评论