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 查询可以告诉我们哪个袋子里面包含我们搜索的 ...
随机推荐
- 《图解Java多线程设计模式》读书笔记
略读中...后面详读的时候,补充经典图片和文字说明
- log4.net使用指南
1.简介 1.1 Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断 ...
- vw、vh、vmin、vmax、em、rem的使用详解
转载自:https://blog.csdn.net/ZNYSYS520/article/details/76053961 1,vw.vh.vmin.vmax 的含义 (1)vw.vh.vmin.vma ...
- 在Eclipse中启动tomcat后访问tomcat首页时出现404
在Eclipse中配置好tomcat后,把一个web项目发布到tomcat上去,当使用http://localhost:8080访问tomcat首页时出现404错误,但可以正常访问web页面,然而当在 ...
- HttpClient MultipartEntityBuilder 上传文件
文章转载自: http://blog.csdn.net/yan8024/article/details/46531901 http://www.51testing.com/html/56/n-3707 ...
- 数据流中的中位数 Find Median from Data Stream
2019-04-17 16:34:50 问题描述: 问题求解: class MedianFinder { PriorityQueue<Integer> smaller; PriorityQ ...
- 三年磨一剑,robot framework 自动化测试框架核心指南,真正讲透robot framework自动化测试框架(笔者新书上架)。
序 关于自动化测试的工具和框架其实有很多.自动化测试在测试IT行业中扮演着越来越重要的角色,不管是在传统的IT行业还是高速发展的互联网行业或是如今的大数据和大热的人工智能领域,都离不开测试,也更加离不 ...
- vue文件上传控件
下载地址:https://pan.baidu.com/s/1Z3pFh2J3xWa8YYnLoseasg 使用方式: <upload ref='upload' action-url='' :mu ...
- Matlab - 基础知识
Matlab R2016a完全自学一本通 记在前面: (1)函数中:dim=1 按列:dim=2 按行 (2)这本书很垃圾,不建议买. (3)在数据库连接中,用两个单引号表示字符串,千万不能用双引号 ...
- 弹筐里同一个按钮判断是从哪里点击过来的form
点击弹框按钮 <form action="javascript:;" method="post"> <button type= ...