Elastic Search中Query String常见语法
1 搜索所有数据
timeout参数:是超时时长定义。代表每个节点上的每个shard执行搜索时最多耗时多久。不会影响响应的正常返回。只会影响返回响应中的数据数量。
如:索引a中,有10亿数据。存储在5个shard中,假设每个shard中2亿数据,执行全数据搜索的时候,需要耗时1000毫秒。定义timeout为10毫秒,代表的是shard执行10毫秒,搜索出多少数据,直接返回。
语法:
GET _search?timeout=10ms
结果:
{
"took": 144, #请求耗时多少毫秒
"timed_out": false, #是否超时。默认情况下没有超时机制,也就是客户端等待ES搜索结束(无论执行多久),提供超时机制的话,ES则在指定时长内处理搜索,在指定时长结束的时候,将搜索的结果直接返回(无论是否搜索结束)。指定超时的方式是传递参数,参数单位是:毫秒-ms。秒-s。分钟-m。
"_shards": {
"total": 1, #请求发送到多少个shard上
"successful": 1,#成功返回搜索结果的shard
"skipped": 0, #停止服务的shard
"failed": 0 #失败的shard
},
"hits": {
"total": 1, #返回了多少结果
"max_score": 1, #搜索结果中,最大的相关度分数,相关度越大分数越高,_score越大,排位越靠前。
"hits": [ #搜索到的结果集合,默认查询前10条数据。
{
"_index": "test_index", #数据所在索引
"_type": "my_type", #数据所在类型
"_id": "1", #数据的id
"_score": 1, #数据的搜索相关度分数
"_source": { # 数据的具体内容。
"field": "value"
}
}
]
}
}
2 _all应用1
_all也是ES中的一个内置元数据。也可以成为内置变量名。代表全部的意思。一般来说_all使用的很少。
语法:
GET /_all/_search
这种_all的用法相当于在所有的索引中搜索数据。也就是_all代表所有的索引。
3 multi-index搜索模式
所谓的multi-index就是从多个index中搜索数据。相对使用较少,只有在复合数据搜索的时候,可能出现。一般来说,如果真使用复合数据搜索,都会使用_all。
如:搜索引擎中的无条件搜索。(现在的应用中都被屏蔽了。使用的是默认搜索条件,执行数据搜索。 如: 电商中的搜索框默认值, 搜索引擎中的类别)
无条件搜索,在搜索应用中称为“魔鬼搜索”,代表的是,搜索引擎会执行全数据检索,效率极低,且对资源有非常高的压力。
语法:
GET _search GET /index_name1,index_name2/_search # 搜索多个index中的数据 GET /index_name/type_name1/_search # 所属一个index中type的数据 GET /prefix_*/_search # 通配符搜索
GET /*_suffix/_search GET /index_name1,index_name2/type_name1/_search # 搜索多个index中type的数据 GET /_all/_search # _all代表所有的索引
4 分页搜索
语法:
GET /_search?size=10 # size查询数据的行数 GET /_search?from=0&size=10 # from 从第几行开始查询,行号从0开始。
4.1 deep paging问题
什么是deep paging?
就是搜索深度,如数据有100万,分页要求每页50条数据,总计2万页,现在搜索第1000页,执行的搜索语句就是: GET /_search?from=49999&size=50。执行的时候,请求发送到协调节点中,协调节点将搜索请求发送给所有的节点,而数据可能分部在多个节点中,那么搜索过程就很麻烦了。过程是集群中的每个节点将节点内符合要求的数据返回给协调节点,协调节点再将所有节点返回的数据根据默认排序条件(_score)排序,并筛选最终符合要求的数据返回给客户端。
这个搜索的过程对协调节点的压力太高。尽量避免出现deep paging操作。
上述案例解释:集群有4个节点,每个节点有1个分片(primary shard),每个分片中有数据25万。请求发起,命令为GET /_search?from=49999&size=50。协调节点将请求发给所有的节点,所有的节点分别查询第50000~50050条数据,ES的分页实际上是伪分页,每个节点返回的数据是0~50050条数据。协调节点得到的数据是50050*4条数据。协调节点实现排序,再找出50000~50050的50条数据,再返回。
5 +/-搜索
语法:
GET /products_index/phone_type/_search?q=name:plus GET /products_index/phone_type/_search?q=+name:plus GET /products_index/phone_type/_search?q=-name:plus
+ :和不定义符号含义一样,就是搜索指定的字段中包含key words的数据
- : 与+符号含义相反,就是搜索指定的字段中不包含key words的数据
6 _all应用2
如:电商平台中,搜索手机,问,是搜索商品名中包含手机的商品?还是搜索商品卖点中包含手机的商品?还是搜索商品详情描述中包含手机的商品?
在ES中,可以直接提供一个搜索关键字,不提供搜索的字段名。默认是再全字段数据中搜索关键字内容。
在ES中,每保存一个document,都会将document中所有的field拼接到一起,保存为一个命名为_all的字段。这个_all字段,就是默认搜索的字段。
_all是一个默认使用的搜索数据存储单元,不是一个可以指明使用的字段命名。
语法:
GET /index_name/type_name/_search?q=key_words
这种搜索代表索引中的Document中,任意的一个field包含key_words都会被搜索到。执行命令的时候,ES底层是使用_all元数据搜索的。在ES维护Document的时候,会将Document中的所有字段数据作为一个_all元数据执行的field。如:
Document数据是{ "name" : "zhangsan", "age" : 20, "email" : "zhangsan@163.com" },在ES保存Document的时候,会额外维护一个_all字段,字段数据为"zhangsan 20 zhangsan@163.com"。那么在搜索的时候,不指定要搜索匹配的field,ES就从_all元数据中匹配key_words。
不推荐生产环境中使用,因为数据越复杂,搜索效率越低。
Elastic Search中Query String常见语法的更多相关文章
- Elastic search中使用nested类型的内嵌对象
在大数据的应用环境中,往往使用反范式设计来提高读写性能. 假设我们有个类似简书的系统,系统里有文章,用户也可以对文章进行赞赏.在关系型数据库中,如果按照数据库范式设计,需要两张表:一张文章表和一张赞赏 ...
- Elastic Search中filter的理解
在ES中,请求一旦发起,ES服务器是按照请求参数的顺序依次执行具体的搜索过滤逻辑的.如何定制请求体中的搜索过滤条件顺序,是一个经验活.类似query(指search中的query请求参数),也是搜索的 ...
- Elastic Search中Document的CRUD操作
一. 新增Document在索引中增加文档.在index中增加document.ES有自动识别机制.如果增加的document对应的index不存在.自动创建,如果index存在,type不存在自动创 ...
- elastic search 日期为string类型导致视图无法展示时间的解决办法
尝试将结构化的json数据发送到es(elastic search)上,然后创建视图,这样就能以小时维度查看数据,直接使用post发送到es后,创建索引,结果提示 没有date类型的字段(field) ...
- Elastic Search中DSL Query的常见语法
Query DSL是一种通过request body提交搜索参数的请求方式.就是将请求头参数(?xxx=xxx)转换为请求体参数.语法格式:GET [/index_name/type_name]/_s ...
- k8s中yaml文常见语法
在k8s中,所有的配置都是 json格式的.但为了读写方便,通常将这些配置写成yaml 格式,其运行的时候,还是会靠yaml引擎将其转化为json,apiserver 也仅接受json的数据类型. y ...
- Elastic Search中mapping的问题
Mapping在ES中是非常重要的一个概念.决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段,是否需要copy to其他字段等.Mapping决定了index中 ...
- Elastic Search中normalization和分词器
为key_words提供更加完整的倒排索引. 如:时态转化(like | liked),单复数转化(man | men),全写简写(china | cn),同义词(small | little)等. ...
- Elasticsearch由浅入深(七)搜索引擎:_search含义、_multi-index搜索模式、分页搜索以及深分页性能问题、query string search语法以及_all metadata原理
_search含义 _search查询返回结果数据含义分析 GET _search { , "timed_out": false, "_shards": { , ...
随机推荐
- 【java设计模式】-07适配器模式
适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 类型: 结构型模式 应用实例: 1.JAVA JDK 1.1 提供 ...
- [笔记]C++声明返回数组指针的函数
数组指针的声明:type (*name)[size]; 由于数组不能拷贝,所以函数不能返回数组.但是函数可以返回指针和引用,所以函数可以返回数组指针或引用. 和数组指针的声明类似: type (*fu ...
- ImportError: DLL load failed: 找不到指定的模块
如果遇到错误:ImportError: DLL load failed: 找不到指定的模块出现错误原因:安装包的来源问题,也可以理解为包版本兼容问题,有的包使用官方出版,有的包使用whl文件安装 解决 ...
- Leetcode题目136.只出现一次的数字(简单)
---恢复内容开始--- 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外 ...
- BOM问题
在php编写中,很多人喜欢用notepad editplus 等等在windows下编写程序, 这就很容易出现一个问题,那就是文件签名的东西--BOM!所谓BOM,全称是Byte Order Mark ...
- Python接口测试-利用登录后的session用到登录后的接口中
有些接口是在登录后才能调用的,例如“立即出借”只有在登录后才能到出借窗口,解决: 主要是添加了: s =requests.session() 完整代码: '''登录 ''' print('*'*100 ...
- mybatis之分页查询
1)StudentDao.java /** * 持久层*/ public class StudentDao { /** * 增加学生 */ public void add(Student studen ...
- Linux下四款常见远程工具比较
摘要:Linux远程可不像Windows下那么方便,主要是连接的速度.显示的画质不能令人满意(延迟.撕裂).本文只是说一下我用过的四款远程工具.Anydesk官网:https://anydesk.co ...
- Selenium 2自动化测试实战41(多线程技术)
多线程技术 python通过两个标准库thread和threading提供对线程的支持.thread提供了低级别的,原始的线程以及一个简单的锁.threading基于Java的线程模型设计. 1.th ...
- js 中 new call apply bind JSON.stringify 的原理以及模拟实现
1.new的原理和实现 它创建了一个全新的对象. 它会被执行 [[Prototype]](也就是 __proto__)链接. 它使 this指向新创建的对象. 通过 new创建的每个对象将最终被 [[ ...