Elasticsearch由浅入深(一)简介、、安装、CRUD

什么是Elasticsearch

什么是搜索

百度:咱们好比说想找寻任何的信息的时候,就会上百度去搜索一下,好比说找一部本身喜欢的电影,或者说找一本喜欢的书,或者找一条感兴趣的新闻(提到搜索的第一印象),百度 != 搜索java

垂直搜索(站内搜索)node

互联网的搜索:电商网站,招聘网站,新闻网站,各类app算法

IT系统的搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单”数据库

搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,而后就指望找到这个关键字相关的有些信息json

若是用数据库作搜索会怎么样

作软件开发的话,或者对IT、计算机有必定的了解的话,都知道,数据都是存储在数据库里面的,好比说电商网站的商品信息,招聘网站的职位信息,新闻网站的新闻信息,等等吧。因此说,很天然的一点,若是说从技术的角度去考虑,如何实现如说,电商网站内部的搜索功能的话,就能够考虑,去使用数据库去进行搜索。windows

  1. 比方说,每条记录的指定字段的文本,可能会很长,好比说“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的全部文本进行扫描,懒判断说,你包不包含我指定的这个关键词(好比说“牙膏”)
  2. 还不能将搜索词拆分开来,尽量去搜索更多的符合你的指望的结果,好比输入“生化机”,就搜索不出来“生化危机”

用数据库来实现搜索,是不太靠谱的。一般来讲,性能会不好的。api

什么是全文检索和Lucene

全文检索:倒排索引服务器

lucene:就是一个jar包,里面包含了封装好的各类创建倒排索引,以及进行搜索的代码,包括各类算法。咱们就用java开发的时候,引入lucene jar,而后基于lucene的api进行去进行开发就能够了。用lucene,咱们就能够去将已有的数据创建索引,lucene会在本地磁盘上面,给咱们组织索引的数据结构。另外的话,咱们也能够用lucene提供的一些功能和api来针对磁盘上额restful

什么是Elasticsearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,可以解决不断涌现出的各类用例。 做为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料以外的状况。网络

Elasticsearch的功能、适用场景以及特色

Elasticsearch的功能

  • 分布式的搜索引擎和数据分析引擎

    搜索:百度,网站的站内搜索,IT系统的检索
    数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些
    分布式,搜索,数据分析

  • 全文检索,结构化检索,数据分析

    全文检索:我想搜索商品名称包含牙膏的商品,select * from products where product_name like "%牙膏%"
    结构化检索:我想搜索商品分类为日化用品的商品都有哪些,select * from products where category_id='日化用品'
    部分匹配、自动完成、搜索纠错、搜索推荐
    数据分析:咱们分析每个商品分类下有多少个商品,select category_id,count(*) from products group by category_id

  • 对海量数据进行近实时的处理

    分布式:ES自动能够将海量数据分散到多台服务器上去存储和检索
    海联数据的处理:分布式之后,就能够采用大量的服务器去存储和检索数据,天然而然就能够实现海量数据的处理了
    近实时:检索个数据要花费1小时(这就不要近实时,离线批处理,batch-processing);在秒级别对数据进行搜索和分析
    跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器能够处理的数据量

Elasticsearch的适用场景

  • 国外
    (1)维基百科,相似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐
    (2)The Guardian(国外新闻网站),相似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关见解),数据分析,给到每篇新闻文章的做者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
    (3)Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
    (4)GitHub(开源代码管理),搜索上千亿行代码
    (5)电商网站,检索商品
    (6)日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
    (7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,好比说订阅牙膏的监控,若是高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
    (8)BI系统,商业智能,Business ntelligence。好比说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,**区,最近3年,每一年消费金额呈现100%的增加,并且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化
  • 国内
    站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)

Elasticsearch的特色

 

(1)能够做为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也能够运行在单机上,服务小公司
(2)Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一块儿,才造成了独一无二的ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
(3)对用户而言,是开箱即用的,很是简单,做为中小型的应用,直接3分钟部署一下ES,就能够做为生产环境的系统来使用了,数据量不大,操做不是太复杂
(4)数据库的功能面对不少领域是不够用的(事务,还有各类联机事务型的操做);特殊的功能,好比全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch做为传统数据库的一个补充,提供了数据库所不不能提供的不少功能

lucene和elasticsearch的前世此生

  • lucene,最早进、功能最强大的搜索库,直接基于lucene开发,很是复杂,api复杂(实现一些简单的功能,写大量的java代码),须要深刻理解原理(各类索引结构)
  • elasticsearch,基于lucene,隐藏复杂性,提供简单易用的restful api接口、java api接口(还有其余语言的api接口)

    (1)分布式的文档存储引擎
    (2)分布式的搜索引擎和分析引擎
    (3)分布式,支持PB级数据

elasticsearch的核心概念

  • Near Realtime(NRT):近实时,两个意思,从写入数据到数据能够被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析能够达到秒级
  • Cluster:集群,包含多个节点,每一个节点属于哪一个集群是经过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来讲,刚开始一个集群就一个节点很正常
  • Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操做的时候),默认节点会去加入一个名称为“elasticsearch”的集群,若是直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,固然一个节点也能够组成一个elasticsearch集群
  • Document&field:文档,es中的最小数据单元,一个document能够是一条客户数据,一条商品分类数据,一条订单数据,一般用JSON数据结构表示,每一个index下的type中,均可以去存储多个document。一个document里面有多个field,每一个field就是一个数据字段。
  • Index:索引,包含一堆有类似结构的文档数据,好比能够有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含不少document,一个index就表明了一类相似的或者相同的document。好比说创建一个product index,商品索引,里面可能就存放了全部的商品数据,全部的商品document。
  • Type:类型,每一个索引里均可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,好比博客系统,有一个索引,能够定义用户数据type,博客数据type,评论数据type。
  • shard:单台机器没法存储大量数据,es能够将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就能够横向扩展,存储更多数据,让搜索和分析等操做分布到多台服务器上去执行,提高吞吐量和性能。每一个shard都是一个lucene index。
  • replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,所以能够为每一个shard建立多个replica副本。replica能够在shard故障时提供备用服务,保证数据不丢失,多个replica还能够提高搜索操做的吞吐量和性能。primary shard(创建索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每一个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。

在windows上安装和启动Elasticseach

  1. 安装JDK,至少1.8.0_73以上版本,java -version
  2. 下载和解压缩Elasticsearch安装包,目录结构,下载地址:https://www.elastic.co/cn/downloads/elasticsearch,下载版本:5.2.0
  3. 启动Elasticsearch:bin\elasticsearch.bat,es自己特色之一就是开箱即用,若是是中小型应用,数据量少,操做不是很复杂,直接启动就能够用了
  4. 检查ES是否启动成功:http://localhost:9200/?pretty
    // name: node名称
    // cluster_name: 集群名称(默认的集群名称就是elasticsearch)
    // version.number: 5.2.0,es版本号
    {
        name: "1LdqLFq",
        cluster_name: "elasticsearch",
        cluster_uuid: "5pqT0Q_XQky6GKjSiFgilA",
        version: {
            number: "5.2.0",
            build_hash: "24e05b9",
            build_date: "2017-01-24T19:52:35.800Z",
            build_snapshot: false,
            lucene_version: "6.4.0"
        },
        tagline: "You Know, for Search"
    }
    View Code
  5. 修改集群名称:elasticsearch.yml
  6. 下载和解压缩Kibana安装包,使用里面的开发界面,去操做elasticsearch,做为咱们学习es知识点的一个主要的界面入口
  7. 启动Kibana:bin\kibana.bat。地址:http://localhost:5601
  8. 进入Dev Tools界面
  9. GET _cluster/health

快速入门案例实战之电商网站商品管理:集群健康检查,文档CRUD

document数据格式

  1. 应用系统的数据结构都是面向对象的,复杂的

  2. 对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,至关麻烦
  3. ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是同样的,基于这种文档数据结构,es能够提供复杂的索引,全文检索,分析聚合等功能
  4. es的document用json数据格式来表达

电商网站商品管理案例背景介绍

有一个电商网站,须要为其基于ES构建一个后台系统,提供如下功能:

  1. 对商品信息进行CRUD(增删改查)操做
  2. 执行简单的结构化查询
  3. 能够执行简单的全文检索,以及复杂的phrase(短语)检索
  4. 对于全文检索的结果,能够进行高亮显示
  5. 对数据进行简单的聚合分析

简单的集群管理

快速检查集群的健康情况

  1. es提供了一套api,叫作cat api,能够查看es中各类各样的数据
    GET /_cat/health?v
    epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
    1566094709 10:18:29  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%

    如何快速了解集群的健康情况?green、yellow、red?

    green:每一个索引的primary shard和replica shard都是active状态的
    yellow:每一个索引的primary shard都是active状态的,可是部分replica shard不是active状态,处于不可用的状态
    red:不是全部索引的primary shard都是active状态的,部分索引有数据丢失了

    为何如今会处于一个yellow状态?

    咱们如今就一个笔记本电脑,就启动了一个es进程,至关于就只有一个node。
    如今es中有一个index,就是kibana本身内置创建的index。
    因为默认的配置是给每一个index分配5个primary shard和5个replica shard,并且primary shard和replica shard不能在同一台机器上(为了容错)。
    如今kibana本身创建的index是1个primary shard和1个replica shard。
    当前就一个node,因此只有1个primary shard被分配了和启动了,可是一个replica shard没有第二台机器去启动。

    作一个小实验:此时只要启动第二个es进程,就会在es集群中有2个node,而后那1个replica shard就会自动分配过去,而后cluster status就会变成green状态。

快速查看集群中有哪些索引

GET _cat/indices?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana xpiNHK4UQb2569AzgiveSw   1   1          1            0      3.1kb          3.1kb

简单的索引操做

  • 建立索引
    PUT /test_index?pretty
  • 删除索引
    DELETE /test_index?pretty

商品的CRUD操做

新增商品:新增文档,创建索引

语法:

PUT /index/type/id
{
  "json数据"
}

示例:

PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}

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" ]
}
View Code

es会自动创建index和type,不须要提早建立,并且es默认会对document每一个field都创建倒排索引,让其能够被搜索

查询商品:检索文档

语法:

GET /index/type/id

示例:

GET /ecommerce/product/1

{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "name": "gaolujie yagao",
    "desc": "gaoxiao meibai",
    "price": 30,
    "producer": "gaolujie producer",
    "tags": [
      "meibai",
      "fangzhu"
    ]
  }
}
View Code

修改商品:替换文档

语法:

PUT /index/type/id
{
  "json数据"
}

示例:

PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}
View Code

替换方式有一个很差,即便必须带上全部的field,才能去进行信息的修改(意思是会所有覆盖)

修改商品:更新文档

语法:

POST /index/type/id/_update
{
  "json数据"
}

示例:

POST /ecommerce/product/1/_update
{
  "doc": {
    "name": "jiaqiangban gaolujie yagao"
  }
}

{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 8,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
View Code

删除商品:删除文档

语法:

DELETE /index/type/id

示例:

DELETE /ecommerce/product/1

{
  "found": true,
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 9,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
View Code

快速入门案例实战之电商网站商品管理:多种搜索方式

query string search

搜索所有商品:

GET /ecommerce/product/_search
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "jiajieshi yagao",
          "desc": "youxiao fangzhu",
          "price": 25,
          "producer": "jiajieshi producer",
          "tags": [
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "gaolujie yagao",
          "desc": "gaoxiao meibai",
          "price": 30,
          "producer": "gaolujie producer",
          "tags": [
            "meibai",
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "zhonghua yagao",
          "desc": "caoben zhiwu",
          "price": 40,
          "producer": "zhonghua producer",
          "tags": [
            "qingxin"
          ]
        }
      }
    ]
  }
}
View Code
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:数据拆成了5个分片,因此对于搜索请求,会打到全部的primary shard(或者是它的某个replica shard也能够)
hits.total:查询结果的数量,3个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的详细数据

搜索商品名称中包含yagao的商品,并且按照售价降序排序

GET /ecommerce/product/_search?q=name:yagao&sort=price:desc

query string search的由来,由于search参数都是以http请求的query string来附带的

适用于临时的在命令行使用一些工具,好比curl,快速的发出请求,来检索想要的信息;可是若是查询请求很复杂,是很难去构建的
在生产环境中,几乎不多使用query string search

query DSL

DSL:Domain Specified Language,特定领域的语言

优势:更加适合生产环境的使用,能够构建复杂的查询

http request body:请求体,能够用json的格式来构建查询语法,比较方便,能够构建各类复杂的语法,比query string search确定强大多了

  • 查询全部的商品:
    GET /ecommerce/product/_search
    {
      "query": {
        "match_all": {}
      }
    }
  • 查询名称包含yagao的商品,同时按照价格降序排序
    GET /ecommerce/product/_search
    {
      "query": {
        "match": {
          "name": "yagao"
        }
      },
      "sort": [
        {
          "price": {
            "order": "desc"
          }
        }
      ]
    }
  • 分页查询商品,总共3条商品,假设每页就显示1条商品,如今显示第2页,因此就查出来第2个商品

    GET /ecommerce/product/_search
    {
      "query": {
        "match_all": {}
      },
      "from": 1,
      "size": 1
    }
  • 指定要查询出来商品的名称和价格就能够
    GET /ecommerce/product/_search
    {
      "query": {
        "match_all": {}
      },
      "_source": ["name","price"]
    }

     

query filter

搜索商品名称包含yagao,并且售价大于25元的商品

GET /ecommerce/product/_search
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "name": "yagao"
                }
            },
            "filter": {
                "range": {
                    "price": {
                        "gt": 25
                    }
                }
            }
        }
    }
}

full-text search(全文检索)

新增测试数据

PUT /ecommerce/product/4
{
    "name":"special yagao",
    "desc":"special meibai",
    "price":50,
    "producer":"special yagao producer",
    "tags":["meibai"]
}
View Code

全文模糊检索

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "yagao producer"
        }
    }
}
{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0.70293105,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "4",
        "_score": 0.70293105,
        "_source": {
          "name": "special yagao",
          "desc": "special meibai",
          "price": 50,
          "producer": "special yagao producer",
          "tags": [
            "meibai"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "1",
        "_score": 0.25811607,
        "_source": {
          "name": "gaolujie yagao",
          "desc": "gaoxiao meibai",
          "price": 30,
          "producer": "gaolujie producer",
          "tags": [
            "meibai",
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "3",
        "_score": 0.25811607,
        "_source": {
          "name": "zhonghua yagao",
          "desc": "caoben zhiwu",
          "price": 40,
          "producer": "zhonghua producer",
          "tags": [
            "qingxin"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "2",
        "_score": 0.1805489,
        "_source": {
          "name": "jiajieshi yagao",
          "desc": "youxiao fangzhu",
          "price": 25,
          "producer": "jiajieshi producer",
          "tags": [
            "fangzhu"
          ]
        }
      }
    ]
  }
}
View Code

phrase search(短语搜索)

跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就能够做为结果返回
phrase search,要求输入的搜索串,必须在指定的字段文本中,彻底包含如出一辙的,才能够算匹配,才能做为结果返回

GET /ecommerce/product/_search
{
    "query" : {
        "match_phrase" : {
            "producer" : "yagao producer"
        }
    }
}
{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.70293105,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "4",
        "_score": 0.70293105,
        "_source": {
          "name": "special yagao",
          "desc": "special meibai",
          "price": 50,
          "producer": "special yagao producer",
          "tags": [
            "meibai"
          ]
        }
      }
    ]
  }
}
View Code

highlight search(高亮搜索结果)

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "producer"
        }
    },
    "highlight": {
        "fields" : {
            "producer" : {}
        }
    }
}
{
  "took": 15,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0.25811607,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "1",
        "_score": 0.25811607,
        "_source": {
          "name": "gaolujie yagao",
          "desc": "gaoxiao meibai",
          "price": 30,
          "producer": "gaolujie producer",
          "tags": [
            "meibai",
            "fangzhu"
          ]
        },
        "highlight": {
          "producer": [
            "gaolujie <em>producer</em>"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "3",
        "_score": 0.25811607,
        "_source": {
          "name": "zhonghua yagao",
          "desc": "caoben zhiwu",
          "price": 40,
          "producer": "zhonghua producer",
          "tags": [
            "qingxin"
          ]
        },
        "highlight": {
          "producer": [
            "zhonghua <em>producer</em>"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "2",
        "_score": 0.1805489,
        "_source": {
          "name": "jiajieshi yagao",
          "desc": "youxiao fangzhu",
          "price": 25,
          "producer": "jiajieshi producer",
          "tags": [
            "fangzhu"
          ]
        },
        "highlight": {
          "producer": [
            "jiajieshi <em>producer</em>"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "4",
        "_score": 0.14638957,
        "_source": {
          "name": "special yagao",
          "desc": "special meibai",
          "price": 50,
          "producer": "special yagao producer",
          "tags": [
            "meibai"
          ]
        },
        "highlight": {
          "producer": [
            "special yagao <em>producer</em>"
          ]
        }
      }
    ]
  }
}
View Code

快速入门案例实战之电商网站商品管理:嵌套聚合,下钻分析,聚合分析

计算每一个tag下的商品数量

//将文本field的fielddata属性设置为true

PUT /ecommerce/_mapping/product
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

// 聚合计算
GET /ecommerce/product/_search
{
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}
{
  "took": 20,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 1,
    "hits": [
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "jiajieshi yagao",
          "desc": "youxiao fangzhu",
          "price": 25,
          "producer": "jiajieshi producer",
          "tags": [
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "4",
        "_score": 1,
        "_source": {
          "name": "special yagao",
          "desc": "special meibai",
          "price": 50,
          "producer": "special yagao producer",
          "tags": [
            "meibai"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "gaolujie yagao",
          "desc": "gaoxiao meibai",
          "price": 30,
          "producer": "gaolujie producer",
          "tags": [
            "meibai",
            "fangzhu"
          ]
        }
      },
      {
        "_index": "ecommerce",
        "_type": "product",
        "_id": "3",
        "_score": 1,
        "_source": {
          "name": "zhonghua yagao",
          "desc": "caoben zhiwu",
          "price": 40,
          "producer": "zhonghua producer",
          "tags": [
            "qingxin"
          ]
        }
      }
    ]
  },
  "aggregations": {
    "group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "fangzhu",
          "doc_count": 2
        },
        {
          "key": "meibai",
          "doc_count": 2
        },
        {
          "key": "qingxin",
          "doc_count": 1
        }
      ]
    }
  }
}
View Code

不返回hit信息

GET /ecommerce/product/_search
{
  "size": 0,
  "aggs": {
    "all_tags": {
      "terms": { "field": "tags" }
    }
  }
}
{
  "took": 20,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "fangzhu",
          "doc_count": 2
        },
        {
          "key": "meibai",
          "doc_count": 2
        },
        {
          "key": "qingxin",
          "doc_count": 1
        }
      ]
    }
  }
}
View Code

对名称中包含yagao的商品,计算每一个tag下的商品数量

GET /ecommerce/product/_search
{
  "query": {
    "match": {
      "name": "yagao"
    }
  }, 
  "size": 0, 
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "fangzhu",
          "doc_count": 2
        },
        {
          "key": "meibai",
          "doc_count": 2
        },
        {
          "key": "qingxin",
          "doc_count": 1
        }
      ]
    }
  }
}
View Code

先分组,再算每组的平均值,计算每一个tag下的商品的平均价格

GET /ecommerce/product/_search
{
  "size": 0, 
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "fangzhu",
          "doc_count": 2,
          "avg_price": {
            "value": 27.5
          }
        },
        {
          "key": "meibai",
          "doc_count": 2,
          "avg_price": {
            "value": 40
          }
        },
        {
          "key": "qingxin",
          "doc_count": 1,
          "avg_price": {
            "value": 40
          }
        }
      ]
    }
  }
}
View Code

计算每一个tag下的商品的平均价格,而且按照平均价格降序排序

GET /ecommerce/product/_search
{
  "size": 0, 
  "aggs": {
    "group_by_tags": {
      "terms": {
        "field": "tags",
        "order": {
          "avg_price": "desc"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_tags": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "meibai",
          "doc_count": 2,
          "avg_price": {
            "value": 40
          }
        },
        {
          "key": "qingxin",
          "doc_count": 1,
          "avg_price": {
            "value": 40
          }
        },
        {
          "key": "fangzhu",
          "doc_count": 2,
          "avg_price": {
            "value": 27.5
          }
        }
      ]
    }
  }
}
View Code

按照指定的价格范围区间进行分组,而后在每组内再按照tag进行分组,最后再计算每组的平均价格

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": 50
          }
        ]
      },
      "aggs": {
        "group_by_tags": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "average_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "group_by_price": {
      "buckets": [
        {
          "key": "0.0-20.0",
          "from": 0,
          "to": 20,
          "doc_count": 0,
          "group_by_tags": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key": "20.0-40.0",
          "from": 20,
          "to": 40,
          "doc_count": 2,
          "group_by_tags": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "fangzhu",
                "doc_count": 2,
                "average_price": {
                  "value": 27.5
                }
              },
              {
                "key": "meibai",
                "doc_count": 1,
                "average_price": {
                  "value": 30
                }
              }
            ]
          }
        },
        {
          "key": "40.0-50.0",
          "from": 40,
          "to": 50,
          "doc_count": 1,
          "group_by_tags": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "qingxin",
                "doc_count": 1,
                "average_price": {
                  "value": 40
                }
              }
            ]
          }
        }
      ]
    }
  }
}
View Code
相关文章
相关标签/搜索