版权声明:本文由 Hov 所有,发布于 http://chenhy.com ,转载请注明出处。
0 前言
本文是我接触 Elasticsearch 后写下的第一篇文章,旨在通过电商网站商品管理的栗子来熟悉 Elasticsearch 的相关操作,可以说是学习 Elasticsearch 的第一个“Hello World”吧,后续将逐步深入 Elasticsearch 相关内容。
栗子中新增了三种品牌的牙膏“高露洁牙膏”、“佳洁士牙膏”、“中华牙膏”,并对这些数据进行增删改查、数据搜索、数据分析等操作。
注:本文操作环境为 Elasticsearch + Kibana 。
1 文档增删改查(CRUD)
1.1 新增文档,建立索引
格式:
PUT /index/type/id
{
//JSON
}
实例:新增商品(三种品牌的牙膏信息)。
PUT /ecommerce/product/1
{
"name":"gaolujie yagao",
"desc":"gaoxiao meibai",
"price":30,
"producer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}
PUT /ecommerce/product/2
{
"name":"jiajieshi yagao",
"desc":"youxiao fangzhu",
"price":25,
"producer":"jiajieshi producer",
"tags":["fangzhu"]
}
PUT /ecommerce/product/3
{
"name":"zhonghua yagao",
"desc":"caoben zhiwu",
"price":40,
"producer":"zhonghua producer",
"tags":["qingxin"]
}
1.2 检索文档
格式:
GET /index/type/id
实例:查询商品。
GET /ecommerce/product/1
1.3 替换文档
实例:修改商品,将 name 的“gaolujie yagao”改成“jiaqiangban gaolujie yagao”。
此方法其实就是重新“新增”商品信息,例如:我们只是想修改“name”,若我们在 JSON 只出现“name”,最终将只剩“name”,其它的都不见了。
PUT /ecommerce/product/1
{
"name":"jiaqiangban gaolujie yagao",
"desc":"gaoxiao meibai",
"price":30,
"producer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}
1.4 更新文档
实例:修改商品,将 name 的“gaolujie yagao”改成“jiaqiangban gaolujie yagao”。
注意 _update API,通过 _update 可以只修改 name 字段。
POST /ecommerce/product/1/_update
{
"name":"jiaqiangban gaolujie yagao",
}
1.5 删除文档
实例:删除 ID 为 1 的商品信息。
DElETE /ecommerce/product/1
2 Elasticsearch搜索方式
2.1 Query String Search
实例:搜索 product 下的全部商品。
GET /ecommerce/product/_search
实例:搜索商品名称包含“yagao”的商品,并按价格降序排序。
GET /ecommerce/product/_search?q=name:yagao&sort=price:desc
2.2 Query DSL
实例:搜索 product 下的全部商品。
GET /ecommerce/product/_search
{
"query":{
"match_all": {}
}
}
实例:搜索商品名称包含“yagao”的商品,并按价格降序排序。
GET /ecommerce/product/_search
{
"query":{
"match": {
"name":"yagao"
}
},
"sort":[
{"price":"desc"}
]
}
实例:分页查询商品。
GET /ecommerce/product/_search
{
"query":{
"match_all": {}
},
"from":1,
"size":1
}
实例:指定查询出来的商品只显示名称和价格。
GET /ecommerce/product/_search
{
"query":{
"match_all": {}
},
"_source": ["name","price"]
}
2.3 Query Filter
实例:搜索商品名称包含“yagao”,价格大于25元的商品。
GET /ecommerce/product/_search
{
"query":{
"bool":{
"must": {
"match":{
"name":"yagao"
}
},
"filter":{
"range":{
"price":{
"gt":25
}
}
}
}
}
}
2.4 Full-text Search(全文检索)
实例:全文检索“yagao producer”,只要“yagao”、“producer”中出现一个就可以被检索出来。
producer 字段将先被拆解成“yagao”、“producer”,并建立倒排索引。
- special:4
- yagao:4
- producer:1,2,3,4
- gaolujie:1
- zhonghua:3
- jiajieshi:2
GET /ecommerce/product/_search
{
"query":{
"match":{
"producer":"yagao producer"
}
}
}
2.5 Phrase Search(短语搜索)
实例:短语搜索“yagao producer”,只有“yagao producer”同时存在才会被检索出来。
GET ecommerce/product/_search
{
"query":{
"match_phrase":{
"producer": "yagao producer"
}
}
}
2.6 Highlight Search(高亮搜索)
实例:检索结果高亮。
GET ecommerce/product/_search
{
"query":{
"match_phrase":{
"producer": "producer"
}
},
"highlight": {
"fields": {
"producer": {}
}
}
}
3 聚合分析
实例1:搜索每个 tag 下的商品。
GET /ecommerce/product/_search
{
"aggs": {
"group_by_tags": {
"terms": {"field": "tags"}
}
}
}
实例2:计算每个 tag 下的商品的平均价格,并降序排序。
GET ecommerce/product/_search
{
"size":0,
"aggs":{
"group_by_tags":{
"terms":{
"field": "tags",
"order":{
"avg_price":"desc"
}
},
"aggs":{
"avg_price":{
"avg":{
"field": "price"
}
}
}
}
}
}
实例3:按照指定价格范围分组,在每组内按照 tags 分组,最后计算每组平均价格。
GET ecommerce/product/_search
{
"size":0,
"aggs":{
"group_by_price":{
"range":{
"field": "price",
"ranges":[
{
"from":0,
"to":20
},
{
"from":20,
"to":40
},
{
"from":40,
"to":60
}
]
},
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
},
"aggs":{
"avg_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
}
}