Elasticsearch 系列导航

elasticsearch 与 elasticsearch-head 的安装

ElasticSearch Index API && Mapping

在ElasticSearch中使用 IK 中文分词插件

ElasticSearch 基本概念

Nest客户端的基本使用方法

持续更新中

正文

假设你已经有一份数据保存在Elasticsearch里,类似于下面这种schema,如果没有参考导入测试数据

{
"account_number": 0,
"balance": 16623,
"firstname": "Bradshaw",
"lastname": "Mckenzie",
"age": 29,
"gender": "F",
"address": "244 Columbus Place",
"employer": "Euron",
"email": "bradshawmckenzie@euron.com",
"city": "Hobucken",
"state": "CO"
}

那么我们接下来就可以 过滤,搜索,聚合来获取到我们想要的数据。

Elasticsearch提供了一套Json风格的领域特定语言来帮助查询,被称为Query DSL.

搜索通过在URL结尾加_search来指定,具体查询提交通过Request Body来指定,

比如下面的Request Body:

query: 用来指定查询条件

from:从第几个开始取

size:取多少条记录,默认10条,比如这个例子有13条记录满足条件,但是只返回1条记录

sort:用来指定排序规则

OK,通过刚才的实验,我们对查询有了一个基本的认识,下面让我们来继续认识更加有趣的查询:

  1. 减少返回字段的个数(默认情况下是返回一个文档的所有字段信息)

    {
    "query": { "match_all": {} },
    "_source": ["account_number", "balance"]
    }
  2. 返回account_number等于20的account
    {
    "query": { "match": { "account_number": 20 } }
    }

    match是一个模糊匹配,但是由于account_number是long类型,所以这里当做精确匹配来过滤

  3. 返回address字段中包含mill的account
    {
    "query": { "match": { "address": "mill" } }
    }

    由于address是text类型,所以这里说的是包含mill而不是等于mill.

  4. 返回address字段中包含"mill" 或 "lane"的account
    {
    "query": { "match": { "address": "mill lane" } }
    }

    由于address是text类型,而且"mill lane"这里在查询的时候被当作两个词来分别进行查询

  5. 返回address字段中包含"mill lane"的account

    这里使用match_phrase(短语匹配)查询类型,把"mill lane"当作一个整体来查询

    {
    "query": { "match_phrase": { "address": "mill lane" } }
    }

     

  6. 返回address字段中同时包含"mill" 和 "lane"的account
    {
    "query": {
    "bool": {
    "must": [
    { "match": { "address": "mill" } },
    { "match": { "address": "lane" } }
    ]
    }
    }
    }

    这里使用了bool查询语句,它允许我们组合多个小的查询一起来完成稍微复杂的查询,bool must 要求所有子查询返回true,所有子查询之间可以理解为一个and的操作。

  7. 返回address字段中包含"mill" 或 "lane"的account

    bool should 要求子查询中的任一个满足条件,可以理解为或的关系

    {
    "query": {
    "bool": {
    "should": [
    { "match": { "address": "mill" } },
    { "match": { "address": "lane" } }
    ]
    }
    }
    }
  8. 返回address字段中既不包含"mill" 也不包含 "lane"的account

    bool must_not子句之间是或的关系

    {
    "query": {
    "bool": {
    "must_not": [
    { "match": { "address": "mill" } },
    { "match": { "address": "lane" } }
    ]
    }
    }
    }
  9. 返回年龄等于40 且不住在ID地区的account
    {  "query": {
    "bool": {
    "must": [
    { "match": { "age": "40" } }
    ],
    "must_not": [
    { "match": { "state": "ID" } }
    ]
    }
    }
    }

我们可以同时联合must, should, and must_not子句在一个bool语句内,

也可以继续在bool子句下面继续嵌套使用bool子句来完成更加复杂的查询需求。

 Filter 过滤

在返回的结果中有一个_score字段,score是一个数值,表示查询条件和这个文档的相关度,分数越高,说明某个文档的相关度越高,

反之,相关度越低,但是查询 并不总是产生分数,尤其当你使用过滤子句来过滤文档的时候,Elasticsearch会自动检测这些场景,

自动优化查询,让他不要去计算无用的分数,之前我们使用的bool查询也支持filter子句,

例如我们想获取账户余额大于等于20000 小于等于30000的账户信息

{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}

上面的这个例子其实挺好理解的,所有在这个range范围内的文档都具有相等的匹配度,

没有哪一个文档比其他的文档匹配度更高,要么在这个范围内,要么不在,所以相关度是相等的,

就没有必要再去计算这个score.

Aggregations聚合

聚合允许你给你的数据分组并获取他们的统计信息,你可以把它和SQL里面的goup by 以及SQL的聚合函数联系起来,

在Elasticsearch,你可以在一个响应里同时返回聚合信息和结果明细,

比如我们使用state来给所有的accounts分组,默认返回前10条聚合记录,顺序按照组内文档数量的倒序排列

{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
}
}
}
}

你可以结合下面的SQL语句更好理解上面的语句

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC
部分返回结果 如下显示:
{
"took": 29,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits" : {
"total" : 1000,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"group_by_state" : {
"doc_count_error_upper_bound": 20,
"sum_other_doc_count": 770,
"buckets" : [ {
"key" : "ID",
"doc_count" : 27
}, {
"key" : "TX",
"doc_count" : 27
}, {
"key" : "AL",
"doc_count" : 25
}, {
"key" : "MD",
"doc_count" : 25
}, {
"key" : "TN",
"doc_count" : 23
}, {
"key" : "MA",
"doc_count" : 21
}, {
"key" : "NC",
"doc_count" : 21
}, {
"key" : "ND",
"doc_count" : 21
}, {
"key" : "ME",
"doc_count" : 20
}, {
"key" : "MO",
"doc_count" : 20
} ]
}
}
}

你可以观察到,上面的聚合我们设置size=0,不去显示符合条件的原始记录,

因为我们这次仅仅需要聚合的结果信息,如果你也需要原始记录信息,那么你可以重新指定size的大小

下面这个例子我们来求余额的平均值

{
"size": 0,
"aggs": {
"group_by_state": {
"terms": {
"field": "state.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}

返回如下的结果,可以看到这里我们在group_by_state里面嵌套使用了average_balance,这是一种比较通用的做法,

你可以在任意聚合内嵌套任意聚合来获取需要的统计信息。

下面这个例子演示根据年龄组来分组,然后根据性别来分组最后求账户余额的平均值

{
"size": 0,
"aggs": {
"group_by_age": {
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
},
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs": {
"group_by_gender": {
"terms": {
"field": "gender.keyword"
},
"aggs": {
"average_balance": {
"avg": {
"field": "balance"
}
}
}
}
}
}
}
}

下面是年龄组分组 计算聚合的部分返回结果:

下面

												

通过Elasticsearch使用的你的数据的更多相关文章

  1. elasticsearch 5.x 系列之五 数据导入导出

    一.首先给大家发一个福利,分享一个elasticsearch 数据导出工具. esm github 源码地址: https://github.com/medcl/esm 下载编译好的对应elastic ...

  2. 使用Spring Data ElasticSearch+Jsoup操作集群数据存储

    使用Spring Data ElasticSearch+Jsoup操作集群数据存储 1.使用Jsoup爬取京东商城的商品数据 1)获取商品名称.价格以及商品地址,并封装为一个Product对象,代码截 ...

  3. ElasticSearch怎样加入,检索数据

    Elasticsearch是一个分布式的文档(document)存储引擎.它能够实时存储并检索复杂数据结构--序列化的JSON文档.换言说,一旦文档被存储在Elasticsearch中,它就能够在集群 ...

  4. ES 17 - (底层原理) Elasticsearch增删改查索引数据的过程

    目录 1 增删改document的流程 1.1 协调节点 - Coordinating Node 1.2 增删改document的流程 2 查询document的流程 1 增删改document的流程 ...

  5. 【原创】大数据基础之ElasticSearch(4)es数据导入过程

    1 准备analyzer 内置analyzer 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis- ...

  6. elasticsearch -- Logstash实现mysql同步数据到elasticsearch

    配置 安装插件由于这里是从mysql同步数据到elasticsearch,所以需要安装jdbc的入插件和elasticsearch的出插件:logstash-input-jdbc.logstash-o ...

  7. Elasticsearch学习笔记——安装、数据导入和查询

    到elasticsearch网站下载最新版本的elasticsearch 6.2.1 ? 1 https://www.elastic.co/downloads/elasticsearch 中文文档请参 ...

  8. 使用ElasticSearch服务从MySQL同步数据实现搜索即时提示与全文搜索功能

    最近用了几天时间为公司项目集成了全文搜索引擎,项目初步目标是用于搜索框的即时提示.数据需要从MySQL中同步过来,因为数据不小,因此需要考虑初次同步后进行持续的增量同步.这里用到的开源服务就是Elas ...

  9. elasticsearch 使用快照方式迁移数据

    注册快照仓库 ES是通过快照的方式来实现数据备份,并且是以增量的方式,所以一般第一次做的话会花费较长的时间.为了做快照,那么就需要注册一个快照仓库,告诉ES我们的快照应该如何保存以及将快照保存到哪里. ...

随机推荐

  1. 【转】Mysql分页语句Limit用法

    http://qimo601.iteye.com/blog/1634748 FAQ: MYSQL limit,offset 区别 SELECT keyword FROM `keyword_rank` ...

  2. 每天一个linux命令(26)--用SecureCRT来上传和下载文件

    用SSH管理Linux 服务器时经常需要远程与本地之间交互文件,而直接使用 SecureCRT 自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmod ...

  3. 一位资深程序员给予Java初学者的学习路线建议

    一位资深程序员给予Java初学者的学习路线建议 java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是我你是如何学习Java的,能不能给点建议?今天我是打算来点干 ...

  4. IOS中Hybird中数据驱动与脚本驱动的实现

    现在Hybird这块,网上也有很多文章,最近小有研究了下,分享给大家. 什么是Hybird技术? 1.一般是指WebView和Native技术混合而成的一套技术方案 2.也可以理解成,非Native技 ...

  5. Vue开源项目库汇总

    最近做了一个Vue开源项目库汇总,里面集合了OpenDigg 上的优质的Vue开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 elem ...

  6. 类比Spring框架来实现OC中的依赖注入

    如果你之前使用过JavaEE开发中的Spring框架的话,那么你一定对依赖注入并不陌生.依赖注入(DI: Dependency Injection)是控制反转(IoC: Inversion of Co ...

  7. 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  8. 多种语言开发Spark-以WordCount为例

    Spark是目前最火爆的大数据计算框架,有赶超Hadoop MapReduce的趋势.因此,趁着现在还有大多数人不懂得Spark开发的,赶紧好好学习吧,为了使不同的开发人员能够很好的利用Spark,S ...

  9. 读headFirst设计模式 - 装饰者模式

    继承可以在复用父类代码的情况下扩展父类的功能,但同时继承增加了对象之间的耦合度,所以要慎用继承.那么有没有既能扩展父类的功能,又能使对象间解耦的方法呢?答案是肯定的,这就是我们今天要学习的装饰者模式. ...

  10. [项目记录] 用c语言完成的一个学生成绩管理系统

    一.要求: 学生成绩管理系统 某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入).使用链表编程实现如下菜单驱动的学生成绩管理系统. 从文件读入每个学生个人信 ...