Elasticsearch 初探

电商网站商品管理


版权声明:本文由 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搜索方式


实例:搜索 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"
              }
            }
          }
        }
      }
    }
  }
}


 
comments powered by Disqus