前言

ElasticSearch(以下简称ES)是一个基于Lucene构建的开源(open-source),分布式(distributed),RESTful,实时(real-time)的搜索与分析(analytics)引擎。它可以让你在浏览数据时具备非常快的速度和优秀的可扩展性。它用于全文索引、结构化数据索引、数据分析以及三者的结合。在初步学习ElasticSearch的时候,我们大部分的时候需要通过其REST API来探索ES提供的各种功能,网上有很多各种干货教程,但基本都是通过curl命令来进行演示,各种小白肯定是不太习惯的,除了输出不够美观整洁之外,也不太方便进行分类,归纳和复用。这里,结合postman一起来演示ES关于搜索的干货教程。

样例数据

为了更好的使用和理解ES,没有点样例数据还是不好模拟的。这里提供了一份官网上的数据,accounts.json。如果需要的话,也可以去这个网址玩玩,它可以帮助你自定义写随机的JSON数据。

导入

打开你的postman,输入对应的REST API,http://10.157.65.152:9200/bank/account/_bulk?pretty
选择post; body->binary; 选择文件,选中你下载好的account.json文件:

注意:

1 10.157.65.152:9200是ES得访问地址和端口

2 bank是索引的名称

3 account是类型的名称

4 索引和类型的名称在文件中如果有定义,可以省略;如果没有则必须要指定

5 _bulk是rest得命令,可以批量执行多个操作

6 pretty是将返回的信息以可读的JSON形式返回。(不过postman自带了pretty的功能)

send之后,可以很快看到结果:

然后我们可以通过另一个REST API查询:
http://10.157.65.152:9200/_cat/indices?v

插入1000条数据成功

保存对应的REST API到postman

下面的步骤很重要,在接下来的文章里面我不会在重复。
点击save:

在弹出的save窗口中,给对应的request起一个合适的名字,比如这里createBankIndex,并将其保存到对应的collection中(在这里,我已提前创建了一个ElasticSearch的collection,专门用于保存和ES相对应的REST API的操作)。如果你的ES服务器的名字会经常变,就请把10.157.65.152:9200保存为一个变量,在所有的case中使用这个变量,具体请看我之前的博文。

搜索API

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

请求参数方式

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

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

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

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

这种方式特别适合在postman里面用,因为postman里面可以使用配合使用各种变量,而且编辑起来更方便:

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

  • took:是查询花费的时间,毫秒单位
  • time_out:标识查询是否超时
  • _shards:描述了查询分片的信息,查询了多少个分片、成功的分片数量、失败的分片数量等
  • hits:搜索的结果,total是全部的满足的文档数目,hits是返回的实际数目(默认是10)
  • _score是文档的分数信息,与排名相关度有关,参考各大搜索引擎的搜索结果,就容易理解。

查询语言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
}'

(记住,还是用postman来做客户端,绝逼比curl好用)
上面的命令返回了所有文档数据中的第一条文档。如果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" } }]}}
}'

(不过这种DSL确实比较反人类)

过滤查询

之前说过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

返回的数据:

由于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也提供了很多复杂的聚合,这里作为引导篇,也不过多介绍了。

对于基本的数据搜索大致就是上面讲述的样子,熟悉了一些常用的API,入门还是很简单的,倒是要熟练使用ES,还是需要掌握各种搜索查询的命令,以及ES内部的原理。

用postman快速学习ElasticSearch的搜索功能相关推荐

  1. elasticsearch高级搜索功能多维度分享

    目录 一.业务搜索核心功能 二.高级搜索匹配功能 三.搜索排序功能 elasticsearch高级搜索功能多维度分享,这也是实战的比较之路,此次我们全面分享常用的业务情景,全覆盖功能分享,让大家有一览 ...

  2. lucene索引搜索_Lucene –快速添加索引和搜索功能

    lucene索引搜索 什么是Lucene? Apache LuceneTM是完全用Java编写的高性能,功能齐全的文本搜索引擎库. 它是一项适用于几乎所有需要全文本搜索的应用程序的技术,尤其是跨平台. ...

  3. Lucene –快速添加索引和搜索功能

    什么是Lucene? Apache LuceneTM是完全用Java编写的高性能,功能齐全的文本搜索引擎库. 它是一项适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台的应用程序. Lucene ...

  4. java 搜索框快速查询_Java项目搜索功能的实现

    今天是刘小爱自学Java的第110天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 事先说明:关于今天的搜索功能实现. 并没有使用到倒排索引这样的主流搜索技术,就一个普通的模糊查询. 在此之前 ...

  5. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎 如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特点 ...

  6. ElasticSearch快速学习---30分钟入门ElasticSearch

    ElasticSearch快速学习 ElasticSearch原理,30分钟入门ElasticSearch 目录 1 解析es的分布式架构 2 分片和副本机制  3 单节点环境下创建索引分析 4 两个 ...

  7. springboot集成Elasticsearch实现各种搜索功能

    springboot集成Elasticsearch各类搜索功能实现 springboot集成Elasticsearch使用completion suggest实现自动关键字补全 建立学生的索引和映射: ...

  8. 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序 --作者:Andrew B. Cencini...

    [摘要]了解如何充分利用SQL Server 2000的全文搜索功能.本文包含有关实现最大吞吐量和最佳性能的几点提示和技巧. 概述 使用Microsoft© SQL Server 2000的全文搜索功 ...

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

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

最新文章

  1. linux下配置oracle 10G EM Database Console
  2. Taurus.MVC 支持Asp.Net Core 的过程
  3. 图文详解如何搭建Windows的Android C++开发环境
  4. 运算符优先级 必熟记,放到心里
  5. Docker在Ubuntu16.04上安装
  6. python 栈和队列_python 栈和队列的基本实现
  7. python傅里叶变换库_python的numpy库和cv2库实现图像傅里叶变换
  8. Python内置函数sorted()高级排序用法
  9. iOS 开发 申请定位
  10. 科研热点|中科院文献情报中心:2022分区表即将发布,这几大变化值得关注~
  11. 3-8 查询水果价格 (15 分)
  12. 烟大计算机考研二战,以坚持铺就考研之路——记经济管理学院考研优秀个人程林林...
  13. 云计算工程师面试题集锦,云计算面试题及答案
  14. 计算机科学学现代,现代计算机科学的鼻祖
  15. mysql中文名字段引起的触发器语法错误
  16. Linux查看进程运行的完整路径方法
  17. 管理计算机找不到应用程序,电脑联网时显示找不到应用程序怎么办
  18. Fabric区块链架构说明
  19. 摄像头直播 嵌入html,在html下如何实现摄像头录制的视频实时显示在当前页面中的另一个video中...
  20. c语言里面log函数怎么用

热门文章

  1. 主键约束(primary key,简称PK)
  2. 闲鱼交易猫跳转APP源码+后台管理
  3. experience
  4. TCP(传输控制协议)和UDP(用户数据报协议)的区别
  5. JSP密码不少于6位
  6. python 好玩的小乌龟
  7. freetype字体
  8. 根据设计图设计rem比例
  9. 做哪些网站基本优化可以提高网站权重?
  10. 数学 - 基本初等函数及其图像