一、问题源起

在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之多索引查询的更多相关文章

  1. elasticsearch索引查询,日志搜素

    索引查询 http://10.199.137.115:9200/_cat/indices?format=json 返回json字符串的索引状态 增加索引名称过滤 http://10.199.137.1 ...

  2. ElasticSearch第四步-查询详解

    ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...

  3. Elasticsearch 之 数据索引

    对于提供全文检索的工具来说,索引时一个关键的过程——只有通过索引操作,才能对数据进行分析存储.创建倒排索引,从而让使用者查询到相关的信息. 本篇就ES的数据索引操作相关的内容展开: 更多内容参考:El ...

  4. ElasticSearch(6)-结构化查询

    引用:ElasticSearch权威指南 一.请求体查询 请求体查询 简单查询语句(lite)是一种有效的命令行_adhoc_查询.但是,如果你想要善用搜索,你必须使用请求体查询(request bo ...

  5. ElasticSearch基础(4)-索引

    一.ES API常用规则 ES支持以Http协议的方式提供REST服务,以JSON格式发送请求返回响应. ES提供了大量的不管的数据操作,运维管理API,大量的api 这海量的api有一些通用的功能特 ...

  6. Elasticsearch java api 常用查询方法QueryBuilder构造举例

    转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...

  7. Elasticsearch 关键字:索引,类型,字段,索引状态,mapping,文档

    1. 索引(_index)索引:说的就是数据库的名字.我这个说法是对应到咱经常使用的数据库. 结合es的插件 head 来看. 可以看到,我这个地方,就有这么几个索引,索引就是数据库,后面是这个数据库 ...

  8. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  9. 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...

随机推荐

  1. 2016广东工业大学新生杯决赛 A-pigofzhou的巧克力棒

    题目:GDUTOJ | pigofzhou的巧克力棒 (gdutcode.cn) 之前看了大佬博客的题解,一直没懂(我太菜了),后来听了朋友@77的讲解,终于懂了. 和拆分出2的n次方不一样,这是一种 ...

  2. JDK1.8新特性(一): 接口的默认方法default

    前言 今天在学习mysql分区优化时,发现一个博客专家大神,对其发布的文章简单学习一下: 一:简介 我们通常所说的接口的作用是用于定义一套标准.约束.规范等,接口中的方法只声明方法的签名,不提供相应的 ...

  3. 3.7 rust 静态块

    Cargo.toml [dependencies] lazy_static = "1.4.0" main.rs #[macro_use] extern crate lazy_sta ...

  4. 什么是maven(二)

    转自博主--一杯凉茶 maven项目构建ssh工程(父工程与子模块的拆分与聚合)   前一节我们明白了maven是个什么玩意,这一节就来讲讲他的一个重要的应用场景,也就是通过maven将一个ssh项目 ...

  5. String 、StringBuffer、StringBuilder的区别

    String:字符串常量 StringBuffer:字符串变量:线程安全的 StringBuilder:字符串变量:线程非安全的 三者执行速度比较:StringBuilder >  String ...

  6. Unity——WegGL打包问题

    Rendering设置 Gamma和Linear颜色空间,两者有色差,Gamma有个2.25左右的修正值: WebGL2.0可用的情况,只支持Deferred Render延迟渲染,且只支持Linea ...

  7. 重新整理 .net core 实践篇——— UseEndpoints中间件[四十八]

    前言 前文已经提及到了endponint 是怎么匹配到的,也就是说在UseRouting 之后的中间件都能获取到endpoint了,如果能够匹配到的话,那么UseEndpoints又做了什么呢?它是如 ...

  8. 如何在子线程中更新UI

    一:报错情况 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that creat ...

  9. Git忽略提交规则 .gitignore文件

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...

  10. ios self.和_区别

    - "self."调用该类的setter或getter方法,"_"直接获取自己的实例变量.property 和 instance variable 是有区别的. ...