elasticsearch之多索引查询
一、问题源起
在elasticsearch的查询中,我们一般直接通过URL来设置要search的index; 如果我们需要查询的索引比较多并且没有什么规律的话,就会面临一个尴尬的局面,超过URL的长度限制;
二、测试环境
elasticsearch 6.8.12
测试数据
新增三个测试的index,每个index里边一个document;
PUT test1/_doc/1
{
"id":1,
"name":"test1-1"
}
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_version" : 1,
# "result" : "created",
# "_shards" : {
# "total" : 2,
# "successful" : 1,
# "failed" : 0
# },
# "_seq_no" : 0,
# "_primary_term" : 1
# }
PUT test2/_doc/1
{
"id":1,
"name":"test2-1"
}
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_version" : 1,
# "result" : "created",
# "_shards" : {
# "total" : 2,
# "successful" : 1,
# "failed" : 0
# },
# "_seq_no" : 0,
# "_primary_term" : 1
# }
PUT test3/_doc/1
{
"id":1,
"name":"test3-1"
}
# {
# "_index" : "test3",
# "_type" : "_doc",
# "_id" : "1",
# "_version" : 1,
# "result" : "created",
# "_shards" : {
# "total" : 2,
# "successful" : 1,
# "failed" : 0
# },
# "_seq_no" : 0,
# "_primary_term" : 1
# }
三、URL中指定multi index
直接在URL中指定搜索特定的index
POST test1/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 5,
# "successful" : 5,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 1,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# }
# ]
# }
# }
可以通过都好分割同时搜索多个index;
POST test1,test2/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 1,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# }
# ]
# }
# }
我们可以使用关键字_all指定搜索所有的index;
POST _all/_search
{
"query": {
"match_all": {}
}
}
{
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 15,
# "successful" : 15,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 3,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# },
# {
# "_index" : "test3",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test3-1"
# }
# }
# ]
# }
# }
也可以使用通配符*来匹配一些名字有共同特征的index;
POST test*/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 1,
# "timed_out" : false,
# "_shards" : {
# "total" : 15,
# "successful" : 15,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 3,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# },
# {
# "_index" : "test3",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test3-1"
# }
# }
# ]
# }
# }
还可以使用-来排除某个index;
POST test*,-test2/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test3",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test3-1"
# }
# }
# ]
# }
# }
四、URL中multi index的一些控制选项
如果我们显示search一个不存在的或者关闭的index就会报错;
POST test4/_search
{
"query": {
"match_all": {}
}
}
# {
# "error" : {
# "root_cause" : [
# {
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "test4",
# "index_uuid" : "_na_",
# "index" : "test4"
# }
# ],
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "test4",
# "index_uuid" : "_na_",
# "index" : "test4"
# },
# "status" : 404
# }
POST test3/_close
#
# {
# "acknowledged" : true
# }
POST test3/_search
{
"query": {
"match_all": {}
}
}
# {
# "error": {
# "root_cause": [
# {
# "type": "index_closed_exception",
# "reason": "closed",
# "index_uuid": "KI7Iv4eGRIOk6MsycXokNQ",
# "index": "test3"
# }
# ],
# "type": "index_closed_exception",
# "reason": "closed",
# "index_uuid": "KI7Iv4eGRIOk6MsycXokNQ",
# "index": "test3"
# },
# "status": 400
# }
我们可以使用ignore_unavailable来忽略不存在或者关闭的index;
POST test4/_search?ignore_unavailable=true
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 0,
# "successful" : 0,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 0,
# "max_score" : 0.0,
# "hits" : [ ]
# }
# }
POST test3/_search?ignore_unavailable=true
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 0,
# "successful" : 0,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 0,
# "max_score" : 0.0,
# "hits" : [ ]
# }
# }
如果通过通配符、_all隐式的指定search的index,如果不存在则默认不会报错,不过可以通过allow_no_indices=false来让elasticsearch报错;
POST noexist*/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 0,
# "successful" : 0,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 0,
# "max_score" : 0.0,
# "hits" : [ ]
# }
# }
POST noexist*/_search?allow_no_indices=false
{
"query": {
"match_all": {}
}
}
# {
# "error" : {
# "root_cause" : [
# {
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "noexist*",
# "index_uuid" : "_na_",
# "index" : "noexist*"
# }
# ],
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "noexist*",
# "index_uuid" : "_na_",
# "index" : "noexist*"
# },
# "status" : 404
# }
POST test3*/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 0,
# "successful" : 0,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 0,
# "max_score" : 0.0,
# "hits" : [ ]
# }
# }
POST test3*/_search?allow_no_indices=false
{
"query": {
"match_all": {}
}
}
# {
# "error" : {
# "root_cause" : [
# {
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "test3*"
# }
# ],
# "type" : "index_not_found_exception",
# "reason" : "no such index",
# "resource.type" : "index_or_alias",
# "resource.id" : "test3*"
# },
# "status" : 404
# }
我们也可以使用expand_wildcards来控制展开哪些index,可选值open、closed、none、all;
默认只扩展open;
POST test*/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# }
# ]
# }
# }
POST test*/_search?expand_wildcards=all
{
"query": {
"match_all": {}
}
}
# {
# "error": {
# "root_cause": [
# {
# "type": "index_closed_exception",
# "reason": "closed",
# "index_uuid": "KI7Iv4eGRIOk6MsycXokNQ",
# "index": "test3"
# }
# ],
# "type": "index_closed_exception",
# "reason": "closed",
# "index_uuid": "KI7Iv4eGRIOk6MsycXokNQ",
# "index": "test3"
# },
# "status": 400
# }
POST test*/_search?expand_wildcards=all&ignore_unavailable=true
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# }
# ]
# }
# }
五、使用index aliases封装物理index
aliases是物理索引的别名,请求api的时候,elasticsearch会自动将aliases转化为对应的物理index name;
别名既可以映射到某个特定的index,也可以映射到多个index;
别名也可以同时应用过滤条件,实现只对index的局部数据进行搜索;
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "test*", "alias" : "all_test_indices" } }
]
}
# {
# "acknowledged" : true
# }
POST all_test_indices/_search
{
"query": {
"match_all": {}
}
}
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# }
# ]
# }
# }
六、multi search--通过body指定index
Multi Search API的主要目的是实现在一个API里边实现多个search请求,其通过如下格式分别通过header指定index,body指定查询语句;
header\n
body\n
header\n
body\n
Multi Search API除了与前两者具有相同的指定index name的能力,最大的优势就是通过body传递index name,轻松突破URL的长度限制的局限性;
还有一点就是Multi Search API支持大量的没有特定规律的index name,例如跟时间序列有关的index name等;
GET _msearch
{"index":"test*"}
{"query" : {"match_all" : {}}}
# {
# "responses" : [
# {
# "took" : 0,
# "timed_out" : false,
# "_shards" : {
# "total" : 10,
# "successful" : 10,
# "skipped" : 0,
# "failed" : 0
# },
# "hits" : {
# "total" : 2,
# "max_score" : 1.0,
# "hits" : [
# {
# "_index" : "test1",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test1-1"
# }
# },
# {
# "_index" : "test2",
# "_type" : "_doc",
# "_id" : "1",
# "_score" : 1.0,
# "_source" : {
# "id" : 1,
# "name" : "test2-1"
# }
# }
# ]
# },
# "status" : 200
# }
# ]
# }
elasticsearch之多索引查询的更多相关文章
- elasticsearch索引查询,日志搜素
索引查询 http://10.199.137.115:9200/_cat/indices?format=json 返回json字符串的索引状态 增加索引名称过滤 http://10.199.137.1 ...
- ElasticSearch第四步-查询详解
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
- Elasticsearch 之 数据索引
对于提供全文检索的工具来说,索引时一个关键的过程——只有通过索引操作,才能对数据进行分析存储.创建倒排索引,从而让使用者查询到相关的信息. 本篇就ES的数据索引操作相关的内容展开: 更多内容参考:El ...
- ElasticSearch(6)-结构化查询
引用:ElasticSearch权威指南 一.请求体查询 请求体查询 简单查询语句(lite)是一种有效的命令行_adhoc_查询.但是,如果你想要善用搜索,你必须使用请求体查询(request bo ...
- ElasticSearch基础(4)-索引
一.ES API常用规则 ES支持以Http协议的方式提供REST服务,以JSON格式发送请求返回响应. ES提供了大量的不管的数据操作,运维管理API,大量的api 这海量的api有一些通用的功能特 ...
- Elasticsearch java api 常用查询方法QueryBuilder构造举例
转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...
- Elasticsearch 关键字:索引,类型,字段,索引状态,mapping,文档
1. 索引(_index)索引:说的就是数据库的名字.我这个说法是对应到咱经常使用的数据库. 结合es的插件 head 来看. 可以看到,我这个地方,就有这么几个索引,索引就是数据库,后面是这个数据库 ...
- 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...
- 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询
1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...
随机推荐
- 一次“不负责任”的 K8s 网络故障排查经验分享
作者 | 骆冰利 来源 | Erda 公众号 某天晚上,客户碰到了这样的问题:K8s 集群一直扩容失败,所有节点都无法正常加入集群.在经过多番折腾无解后,客户将问题反馈到我们这里,希望得到技术支持 ...
- C/C++ Qt 数据库与TableView多组件联动
Qt 数据库组件与TableView组件实现联动,以下案例中实现了,当用户点击并选中TableView组件内的某一行时,我们通过该行中的name字段查询并将查询结果关联到ListView组件内,同时将 ...
- C++一元多项式求导
这个题难度不大但是坑有点多,要考虑的点有几个: 1.测试用例为x 0 这个直接输出 0 0即可. 2.注意空格的输出 3.测试点3我好几次都没过,最后参考了别的答案加以修改才通过. 测试点3没过的代码 ...
- @PropertySource配置的用法
功能 加载指定的属性文件(*.properties)到 Spring 的 Environment 中.可以配合 @Value 和@ConfigurationProperties 使用. @Proper ...
- Linux脚本教程
Linux_Shell_脚本参数接收键盘输入 #!/bin/bash #提示"请输入姓名"并等待30秒,把用户的输入保存入变量name中 read -t 30 -p "请 ...
- 使用jquery完成抽奖图片滚动的效果
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>jq ...
- 【JS】原生实现拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- ANTLR 相关术语
下面介绍很多重要的与语言识别相关的术语. 语言(Language) A language is a set of valid sentences 一门语言是一个有效语句的集合. Sentences a ...
- macOS Monterey 12.1 (21C52) 正式版 ISO、IPSW、PKG 下载
本站下载的 macOS Monterey 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装. 2021 年 12 月 14 日, ...
- Redis哨兵 部署和配置
目录 一.哨兵简介 哨兵介绍 哨兵原理 二.哨兵部署 环境介绍 哨兵配置 三.使用验证 一.哨兵简介 哨兵介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在 ...