elasticsearch(4) 轻量搜索
一 空搜索
搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档:
示例
GET 127.0.0.1:9200/_search
响应
{
"took": ,
"timed_out": false,
"_shards": {
"total": ,
"successful": ,
"skipped": ,
"failed":
},
"hits": {
"total": ,
"max_score": ,
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "WOTj8GYBuXRyDW5PpvRN",
"_score": ,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": ,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "test",
"_type": "test",
"_id": "",
"_score": ,
"_source": {
"hello": "world",
"author": "wuzhe"
}
},
{
"_index": "test",
"_type": "test",
"_id": "",
"_score": ,
"_source": {
"test": "test10",
"author": "wuzhe"
}
},
{
"_index": "megacorp",
"_type": "employee",
"_id": "",
"_score": ,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": ,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
},
{
"_index": "test",
"_type": "test",
"_id": "",
"_score": ,
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": ,
"about": "I love to go rock climbing",
"interests": [
"sports",
"music"
]
}
}
]
}
}
我们可以看到响应中的hits段,total代表了es中总共查询到的文档个数,hits里的hits部分则是具体文档的内容,包括文档的index、type、id以及source。空搜索默认返回的是前10个文档的内容。
若想返回更多文档,Elasticsearch 接受 from 和 size 参数:
size 表示应该返回的结果数,默认是10
from 表示应该跳过的结果数, 默认是0
例
GET 127.0.0.1/_search?size=20&from=10
表示获取第11条到30条的文档
- 需要注意的一点是:
理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点,协调节点对 50 个结果排序得到全部结果的前 10 个。现在假设我们请求第 1000 页--结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。
took字段代表的这次搜索的响应时间。
shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。
timed_out字段告诉我们查询是否超时。默认情况下,搜索请求不会超时。但如果低响应时间比完成结果更重要,可以指定 timeout超时时间
例:
GET 127.0.0.1:9200/_search?timeout=10ms
这样的话,在搜索超时之前,ES会返回每个分片中已经查询到的结果,
在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。 但timeout 不是停止执行查询,它仅仅是告知正在协调的节点返回到目前为止收集的结果并且关闭连接。在后台,其他的分片可能仍在执行查询即使是结果已经被发送了。
二 指定索引以及类型
如果想在一个或多个特殊的索引并且在一个或者多个特殊的类型中进行搜索。我们可以通过在URL中指定特殊的索引和类型达到这种效果。
GET 127.0.0.1:9200/_search
在所有的索引中搜索所有的类型
GET 127.0.0.1:9200/test/_search
在 test索引下搜索所有的类型
GET 127.0.0.1:9200/test1,test2/_search
在 test1 和 test2 中搜索。
除了指定索引,指定类型的方式和指定索引是一样的
- 127.0.0.1/9200/test/test/_search
在索引test,类型test下搜索所有文档
ES还提供了‘*’作为通配符
GET 127.0.0.1:9200/t*/_search
在所有以t开头的索引下搜索
GET 127.0.0.1:9200/*/test/_search
在所有索引下的test的类型下搜索
三 轻量搜索
ES提供两种形式的搜索API ,一种是轻量的:查询字符串版本,另一种则是更完整的请求体版本。
先来说一下轻量搜索:查询字符串版本,这种查询方式要求在查询字符串中传递所有的参数。这种方式非常适用于通过命令行做即席查询。
这种搜索方式的结构为
ip:port/_search?q=查询字符串
查询字符串的生成是对以下规则生成的字符串做一次urlEncode
1、若想要查询某个字段包含某个单词的所有文档
+name:xx
表示为查询name字段包含xx的所有文档
2、多个条件之间用空格分割
+name:xx +age:20
表示为查询name包含xx且age包含20的所有文档
3、+ 前缀表示必须与查询条件匹配, - 前缀表示一定不与查询条件匹配。没有 + 或者 - 的所有其他条件都是可选的,匹配的越多,文档就越相关。
+name:xx -age:>20
表示为name包含xx并且排除age>20的所有文档
4、对_all字段查询,,ES会取出一个文档所有字段的值拼接成一个大的字符串,作为 _all 字段进行索引
+(xx)
表示查询所有包含xx的文档
复杂查询示例
+name:(xx yy) +age:> +(football basketball)
表示 查询name属性为xx 或yy 且age属性>20 ,且所有文档内容包含football 或者basketball的文档
编码后的查询字符串为
%2Bname%3A%28xx+yy%+%2Bage%3A%3E20+%2B%28football+basketball%
查询请求为
GET 127.0.0.1:9200/_search?q=%2Bname%3A%28xx+yy%29+%2Bage%3A%3E20+%2B%28football+basketball%29
从中,我们可以看出轻量搜索可以通过简洁的查询字符串表达很复杂的查询。对于通过命令做一次性查询,或者是在开发阶段,都非常方便。
但是,这种精简让调试更加晦涩和困难。而且很脆弱,一些查询字符串中很小的语法错误,像 - , : , / 或者 " 不匹配等,将会返回错误而不是搜索结果。
最后,查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量级的查询,这可能会暴露隐私信息,甚至将集群拖垮。
所以结论是除非是非常信任用户,否则不推荐直接向用户暴露查询字符串功能。
elasticsearch(4) 轻量搜索的更多相关文章
- elasticsearch(5) 请求体搜索
上一篇提到的轻量搜索非常简单便捷,但是通过请求体查询可以更充分的利用查询的强大功能.因为_search api中大部分参数是通过HTTP请求体而非查询字符串来传递的. 一 空查询 对于空查询来说,最简 ...
- 编写轻量ajax组件01-对比webform平台上的各种实现方式
前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- OWIN轻量型框架介绍
OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请 ...
- 阿里云 轻量应用服务器(LAMP) 使用日志记录
phpStudy(PHP运行环境一键安装包) https://www.jb51.net/softs/182860.html 0:PHP开发工具 https://netbeans.org/downloa ...
- 轻量应用服务器安装 phpMyAdmin
第一步:在phpMyAdmin官方网站http://www.phpmyadmin.net/downloads/下载源码包并解压 cd /usr/local/src wget https://files ...
- 实战ELK(4)Metricbeat 轻量型指标采集器
一.介绍 用于从系统和服务收集指标.从 CPU 到内存,从 Redis 到 Nginx,Metricbeat 能够以一种轻量型的方式,输送各种系统和服务统计数据. 1.系统级监控,更简洁(轻量型指标采 ...
- hexo——轻量、简易、高逼格的博客
背景 写blog虽然经历了N多不同时代的产品,恒久不变的始终是自己无人问津的网站.虽然没几个人看,还是隔断时间就要折腾一下.从最开始的wordpress,到tale,到现在的hexo,网站变得越来越简 ...
- ElasticSearch 2 (16) - 深入搜索系列之近似度匹配
ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...
随机推荐
- SparkStreaming流处理
一.Spark Streaming的介绍 1. 流处理 流式处理(Stream Processing).流式处理就是指源源不断的数据流过系统时,系统能够不停地连续计算.所以流式处理没有什么 ...
- pytest--fixture参数化的实现方式和执行顺序
之前看到fixture函数可以通过添加,params参数来实现参数化,后续看到了悠悠 的博客,可以通过@pytest.mark.parametrize来实现,现在做一个总结 实现方式一 通过param ...
- xls到xml
protected void btn_ok_Click(object sender, EventArgs e) { string x = txtpath.Text; ...
- rxjs2学习
学习一个东西,一定不要管他怎么实现的,先详细的了解他的使用方法. 这篇博客的作用是都点到,书越读越薄,但是不详细阐述.为了记忆.如果想知道更详细,只能看相关的博客. 也是把以前看到的东西能串连起来. ...
- JVM垃圾回收(四)- GC算法:实现(1)
GC算法:实现 上面我们介绍了GC算法中的核心概念,接下来我们看一下JVM里的具体实现.首先必须了解的一个重要的事实是:对于大部分的JVM来说,两种不同的GC算法是必须的,一个是清理Young Gen ...
- es索引管理工具-curator
elasticsearch-curator 是官方收购的开源社区周边产品,用来管理es的索引和快照. 官方文档:https://www.elastic.co/guide/en/elasticsear ...
- mysql、nginx、php-fpm的启动与关闭
mysql 一.启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld start 3.使用 sa ...
- 深深感受 Promise.all 带来的速度提升
什么是Promise Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.(摘抄自 阮一峰老师的 ECMAScript 6 入门).具体请查看阮一峰老师的这 ...
- 【转】PO/POJO/BO/DTO/VO的区别
PO :persistent object持久对象 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录. 2 .在hibernate持久化框架中 ...
- 调用 js 生成图片二维码
一.js 生成二维码: 首先,需要引用 jQuery 和 jquery.qrcode.js.然后: //生产二维码 $("#qrcodeCanvas").qrcode({ rend ...