2019独角兽企业重金招聘Python工程师标准>>>

curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size
yellow bank    5   1       1000            0    424.4kb        424.4kb

搜索API

ES提供了两种搜索的方式:请求参数方式 和 请求体方式

请求参数方式

curl 'localhost:9200/bank/_search?q=*&pretty'

其中bank是查询的索引名称,q后面跟着搜索的条件:q=*表示查询所有的内容

请求体方式(推荐这种方式)

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_all": {} }
}'

这种方式会把查询的内容放入body中,会造成一定的开销,但是易于理解。在平时的练习中,推荐这种方式。

返回的内容

{"took" : 26,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"failed" : 0},"hits" : {"total" : 1000,"max_score" : 1.0,"hits" : [ {"_index" : "bank","_type" : "account","_id" : "1","_score" : 1.0, "_source" : {"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}}, {"_index" : "bank","_type" : "account","_id" : "6","_score" : 1.0, "_source" : {"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}}, {"_index" : "bank","_type" : "account","_id" : "13",

返回的内容大致可以如下讲解:

took:是查询花费的时间,毫秒单位

time_out:标识查询是否超时

_shards:描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等

hits:搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)

_score是文档的分数信息,与排名相关度有关,参考各大搜索引擎的搜索结果,就容易理解。

由于ES是一次性返回所有的数据,因此理解返回的内容是很必要的。它不像传统的SQL是先返回数据的一个子集,再通过数据库端的游标不断的返回数据(由于对传统的数据库理解的不深,这里有错还望指正)。

查询语言DSL

ES支持一种JSON格式的查询,叫做DSL,domain specific language。这门语言刚开始比较难理解,因此通过几个简单的例子开始:

下面的命令,可以搜索全部的文档:

{"query": { "match_all": {} }
}

query定义了查询,match_all声明了查询的类型。还有其他的参数可以控制返回的结果:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_all": {} },"size": 1
}'

上面的命令返回了所有文档数据中的第一条文档。如果size不指定,那么默认返回10条。

下面的命令请求了第10-20的文档。

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_all": {} },"from": 10,"size": 10
}'

下面的命令指定了文档返回的排序方式:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_all": {} },"sort": { "balance": { "order": "desc" } }
}'

执行搜索

上面了解了基本的搜索语句,下面就开始深入一些常用的DSL了。

之前的返回数据都是返回文档的所有内容,这种对于网络的开销肯定是有影响的,下面的例子就指定了返回特定的字段:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_all": {} },"_source": ["account_number", "balance"]
}'

再回到query,之前的查询都是查询所有的文档,并不能称之为搜索引擎。下面就通过match方式查询特定字段的特定内容,比如查询余额为20的账户信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match": { "account_number": 20 } }
}'

查询地址为mill的信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match": { "address": "mill" } }
}'

查询地址为mill或者lane的信息:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match": { "address": "mill lane" } }
}'

如果我们想要返回同时包含mill和lane的,可以通过match_phrase查询:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": { "match_phrase": { "address": "mill lane" } }
}'

ES提供了bool查询,可以把很多小的查询组成一个更为复杂的查询,比如查询同时包含mill和lane的文档:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": {"bool": {"must": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}
}'

修改bool参数,可以改为查询包含mill或者lane的文档:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": {"bool": {"should": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}
}'

也可以改写为must_not,排除包含mill和lane的文档:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": {"bool": {"must_not": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}
}'

bool查询可以同时使用must, should, must_not组成一个复杂的查询:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": {"bool": {"must": [{ "match": { "age": "40" } }],"must_not": [{ "match": { "state": "ID" } }]}}
}'

过滤查询

之前说过score字段指定了文档的分数,使用查询会计算文档的分数,最后通过分数确定哪些文档更相关,返回哪些文档。

有的时候我们可能对分数不感兴趣,就可以使用filter进行过滤,它不会去计算分值,因此效率也就更高一些。

filter过滤可以嵌套在bool查询内部使用,比如想要查询在2000-3000范围内的所有文档,可以执行下面的命令:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"query": {"bool": {"must": { "match_all": {} },"filter": {"range": {"balance": {"gte": 20000,"lte": 30000}}}}}
}'

ES除了上面介绍过的范围查询range、match_all、match、bool、filter还有很多其他的查询方式,这里就先不一一说明了。

聚合

聚合提供了用户进行分组和数理统计的能力,可以把聚合理解成SQL中的GROUP BY和分组函数。在ES中,你可以在一次搜索查询的时间内,即完成搜索操作也完成聚合操作,这样就降低了多次使用REST API造成的网络开销。

下面就是通过terms聚合的简单样例:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state"}}}
}'

它类似于SQL中的下面的语句:

SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

返回的数据:

"hits" : {"total" : 1000,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"group_by_state" : {"buckets" : [ {"key" : "al","doc_count" : 21}, {"key" : "tx","doc_count" : 17}, {"key" : "id","doc_count" : 15}, {"key" : "ma","doc_count" : 15}, {"key" : "md","doc_count" : 15}, {"key" : "pa","doc_count" : 15}, {"key" : "dc","doc_count" : 14}, {"key" : "me","doc_count" : 14}, {"key" : "mo","doc_count" : 14}, {"key" : "nd","doc_count" : 14} ]}}
}

由于size设置为0,它并没有返回文档的信息,只是返回了聚合的结果。

比如统计不同账户状态下的平均余额:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state"},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}
}'

聚合支持嵌套,举个例子,先按范围分组,在统计不同性别的账户余额:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '

{"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"},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}}}
}'

聚合可以实现很多复杂的功能,而且ES也提供了很多复杂的聚合,这里作为引导篇,也不过多介绍了。

转载于:https://my.oschina.net/u/3371661/blog/3029855

Elasticsearch 数据搜索篇相关推荐

  1. 大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk

    2019独角兽企业重金招聘Python工程师标准>>> 本文就架构,功能,产品线,概念等方面就ElasticSearch和Splunk做了一下全方位的对比,希望能够大家在制定大数据搜 ...

  2. 【ElasticSearch】大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk

    1.概述 转载:大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk述 本文就架构,功能,产品线,概念等方面就ElasticSearch和Splunk做了一下全方位的对比,希望 ...

  3. Elasticsearch学习第二篇--常用的几种搜索方式

    Elasticsearch学习第二篇--常用的几种搜索方式 一.Query String Search 查询全部 条件查询 二.Query DSL 查询全部 条件查询 三.Query Filter 四 ...

  4. 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...

    在上一篇文章中,我们介绍了<大数据搜索与可视化分析(8)kibana入门教程-2-Discover>,本文学习elasticsearch聚合分析,是对<大数据搜索与可视化分析(3)e ...

  5. 全文搜索引擎Elasticsearch,这篇文章给讲透了

    之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch是做什么的 ...

  6. Paper Pal:一个中英文论文及其代码大数据搜索平台

    点击上方蓝字关注我们 Paper Pal:一个中英文论文及其代码大数据搜索平台 余万, 付聿炜, 熊贇, 朱扬勇 1 引言 在开展科研工作的过程中,科研人员需要从大量实时更新的论文中持续地跟踪学术界前 ...

  7. 【Elasticsearch】如何设计可扩展的 Elasticsearch 数据存储的架构

    1.概述 转载:如何设计可扩展的 Elasticsearch 数据存储的架构 Elasticsearch 允许您存储.搜索和分析大量的结构化或非结构化数据.因为在速度.可扩展性和灵活性方面拥有优势,E ...

  8. 【Elasticsearch】十九种Elasticsearch字符串搜索方式

    1.概述 十九种Elasticsearch字符串搜索方式 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出 ...

  9. 【Elasticsearch】十九种Elasticsearch字符串搜索方式终极介绍 各种 查询

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...

最新文章

  1. 【模型解读】“全连接”的卷积网络,有什么好?
  2. docker修改镜像的存储位置_Docker存储原理
  3. sed-awk命令详解
  4. 计算机主机前耳机没声音,机箱前耳机接口没声音怎么办【解决方法】
  5. 第五部分 家庭创业奔小康6.开家畅销书专送店
  6. 云服务器的出网宽带和入网宽带是什么?
  7. php矢量绘图,打算做一个开源的矢量绘图软件
  8. LeetCode 781. 森林中的兔子
  9. Tableau实现世界GDP排名动态图
  10. JPA项目,Encountered a duplicated sql alias
  11. 小程序源码:聊天斗图微信表情包
  12. Root后安装Xposed框架卡Logo问题
  13. 虚幻4游戏开发_3_创建与继承材质
  14. 史诗般的数据提取任务
  15. Pytorch自动求梯度
  16. 学术应用使用node-http-proxy集成谷歌学术
  17. Verilog的基础知识
  18. python是什么?能干什么
  19. 火狐浏览器如何设置默认打开网页
  20. 微信小程序开发之编译自动生成新文件的解决办法

热门文章

  1. c 取oracle 错误代码,转载ORA-01591错误故障处理
  2. gerber文件_Altium Designer 如何输出PCB gerber文件
  3. mysql分层_MySql中的分层数据
  4. java里正数和负数_Java程序检查数字是正数还是负数
  5. 平安dms开发java_Spring DMS模板同步接收非持久用户消息丢失
  6. 彩虹屁支持java吗_IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件...
  7. mysql表的遍历_MySQL 全表遍历
  8. inventor中齿条怎么画_涨知识干货|瀑布怎么画?山水画刀画中的八种分类
  9. axios 全局配置
  10. PythonEggs