Elasticsearch从入门到放弃:再聊搜索
在前文中我们曾经聊过搜索文档的方法,Elasticsearch 一般适用于读多写少的场景,因此我们需要更多的关注读操作。
Elasticsearch 提供的 Search API 可以分为 URI Search 和 Request Body Search 两大类。从名称上可以直观的看出,URI Search 是使用URI的参数传递参数给 Elasticsearch,Request Body Search 则是将参数放到 Body 中进行传递,下面我们具体来看一下。
URI Search
首先我们来看 URI Search 的一些参数。
- q 指定查询语句,其使用的是 Query String Syntax
- df 指定默认字段,如果不指定,则会查询全部字段
- Sort 对哪些字段进行排序
- from/size 用于分页
此外,我们还可以通过在请求体中指定 profile 参数来查看查询是如何被执行的。
你可以在Kibana中执行下面的查询来看一下 Elasticsearch 的查询是怎样执行的。
GET /movies/_search?q=2012
{
"profile": "true"
}
GET /movies/_search?q=title:2012
{
"profile": "true"
}
GET /movies/_search?q=2012&df=title
{
"profile": "true"
}
在上面这组查询中,当我们指定了查询字段时, Elasticsearch 使用的 query type 是Term Query。

与之对应的还有 Phrase Query。
Term
如果我们的查询条件是 title:(Code Review),那么它使用的就是 Term Query,它等价于查询 title 中存在 Code 或 Review 的文档。
Phrase
如果我们的查询条件是title:"Code Review"这样用引号引起来的,那么它使用的就是 Phrase Query,它等价于查询同时存在 Code 和 Review 的文档,并且 Code 出现的顺序必须在 Review 之前。
这里你可能会有疑问,为什么 Term Query 前后需要加括号,这是 Elasticsearch 中的分组概念,如果想要像我们说的那样,在 titile 字段中查找存在 Code 或 Review 的文档,那么就必须把它们作为一个分组进行查询。这里你可以自己动手试一下不加括号的情况,看一下 Elasticsearch 会如何执行。
Term Query 中还提供了很多种查询语法,例如我们可以只用 AND、OR、NOT 这样的字符进行布尔操作(需要注意它们都必须大写),也可以使用加号或减号表示 must 和 must not 的概念。同时区间、通配符、甚至是正则表达式查询。
Request Body Search
介绍完 URI Search,我们再一起学习一下 Request Body Search,其实在 Elasticsearch 中,Request Body Search 是更加常用的查询方式。因为它能够支持更多高阶的使用方法。
在 Request Body Search 中,我们同样是用 from 和 size 来进行分页,默认的是从0开始,返回10个结果。
排序的方法也是使用 sort,一般建议在“数字型”或“日期型”字段上进行排序。
对于一些字段比较多的文档,我们并不是每次查询都需要全部的字段,这时候就可以在 body 中加上 _source 字段来进行过滤。_source字段可以支持通配符,例如_source:["name*"],查询中就只会返回字段名是 name 开头的字段。
前面我们聊了 Term Query 和 Phrase Query,在 Request Body Search 中,我们使用 Match Query 来进行类似的操作。
GET /movies/_search
{
"query": {
"match": {
"title": "Lord Rings"
}
}
}
在这个例子中,Elasticsearch 会帮我们查询的是 title 中有 Lord 或 Rings 的文档,如果想要查询 Lord 和 Rings,我们需要用到 operator 来进行修改。
GET /movies/_search
{
"query": {
"match": {
"title": {
"query": "Lord Rings",
"operator": "and"
}
}
},
"profile": "true"
}
如果要使用 Phrase 查询,只需要把上面的 match 替换为 match_phrase 即可。
在 Phrase 查询中,可以使用 slot 参数来指定可以插入在中间的单词数量。
GET /movies/_search
{
"query": {
"match_phrase": {
"title": {
"query": "Lord Rings",
"slop": 2
}
}
},
"profile": "true"
}
总结
本文我们学习了 Elasticsearch 的两种查询方法:URI Search 和 Request Body Search 。这里更加推荐使用 Request Body Search,因为它可以支持很多高阶用法,这里我们只介绍了一些比较常用的查询方法,包括 Term Query 和 Phrase Query,也介绍了一些字段的用法,包括分页、排序、过滤字段等。当然,Elasticsearch 的 Request Body Search 还支持很多其他参数,由于篇幅限制,就不再一一介绍了,大家在使用时可以自行查阅官方文档。
最后多说一句,关于 Elasticsearch,我也是刚刚接触,欢迎志同道合的同学一起交流。
Elasticsearch从入门到放弃:再聊搜索的更多相关文章
- Elasticsearch从入门到放弃:分词器初印象
Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来 ...
- Elasticsearch从入门到放弃:瞎说Mapping
前面我们聊了 Elasticsearch 的索引.搜索和分词器,今天再来聊另一个基础内容-- Mapping. Mapping 在 Elasticsearch 中的地位相当于关系型数据库中的 sche ...
- Elasticsearch从入门到放弃:文档CRUD要牢记
在Elasticsearch中,文档(document)是所有可搜索数据的最小单位.它被序列化成JSON存储在Elasticsearch中.每个文档都会有一个唯一ID,这个ID你可以自己指定或者交给E ...
- Elasticsearch从入门到放弃:索引基本使用方法
前文我们提到,Elasticsearch的数据都存储在索引中,也就是说,索引相当于是MySQL中的数据库.是最基础的概念.今天分享的也是关于索引的一些常用的操作. 创建索引 curl -X PUT & ...
- Elasticsearch从入门到放弃:浅谈算分
今天来聊一个 Elasticsearch 的另一个关键概念--相关性算分.在查询 API 的结果中,我们经常会看到 _score 这个字段,它就是用来表示相关性算分的字段,而相关性就是描述一个文档和查 ...
- elasticsearch从入门到出门-03-多种搜索
1.query string search 2.query DSL 3.query filter 4.full-text search 5.phrase search 6.highlight sear ...
- elasticsearch入门到放弃之elasticsearch-head
elasticsearch-head可理解为跟DBeaver一样是一个数据可视化工具,但是这个工具并没有理想中那么好用坑也是很多,我已经在我的github上fork了一份修改后的版本:https:// ...
- 小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
随机推荐
- Spark GraphX企业运用
========== Spark GraphX 概述 ==========1.Spark GraphX是什么? (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...
- 【漏洞复现】Fastjson <=1.2.47远程命令执行
0x01 漏洞概述 漏洞描述 Fastjson是一款开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBe ...
- 【Spring】Bean的LifeCycle(生命周期)
菜瓜:水稻,上次说Bean的LifeCycle,还没讲完 水稻:啥?说人话? 菜瓜:spring,bean,生命周期 水稻:哦哦,下次直接说人话.说正事,先从BeanFactory.Applicati ...
- 人脸识别和手势识别应用(face++)开发
基础认识 本项目使用的是face++平台,人脸识别+手势识别双确认显示. python编程,代码简介,方便扩展. 该项目适用于Windows系统和Linux系统,但必须安装相应的模块,其中包括 l ...
- Linux下搭建redis(源码编译)
[准备环境] Linux centos7 redis下载包 地址:http://www.redis.cn/download.html 前往下载稳定版本 [步骤] 1.下载成功后 把包上传到服务器 ...
- weui上传多图片,前端压缩,base64编码
记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...
- 处理TortoiseGit一直弹出密码框的方法 -输入git@XXXX.com的密码
问题 :在push和pull的时候,一直都弹出这个框 1.开始处搜索TortoiseGit文件夹,找到其中的“PuTTYgen”文件,如下显示 2.运行之后在弹出的窗口中点击下方的“Generate” ...
- spring框架中JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...
- jni不通过线程c回调java的函数
整个工程的项目如下: 1.项目的思路是在activity中启动MyService这个服务,在服务中调用 JniScsManger类中的本地方法startNativeScsService,在 start ...
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name
今天使用docker运行mysql时报错, 执行命令: docker run --restart=always --name mysql5.7 -p 3306:3306 -v /data/mysql/ ...