一、问题源起

在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. 商业爬虫学习笔记day4

    一.获取登录后页面信息的两种方法 1.第一种方法: 人为把有效cookies加到请求头中,代码如下 import urllib.request # 确定url url = "https:// ...

  2. FileReader (三) - 网页拖拽并预显示图片简单实现

    以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...

  3. 容器之分类与各种测试(四)——map

    map和set的区别在于,前者key和value是分开的,前者的key不会重复,value可以重复:后者的key即为value,后者的value不允许重复.还有,map在插入时可以使用 [ ]进行(看 ...

  4. 利用extern共享全局变量

    方法: 在xxx.h中利用extern关键字声明全局变量 extern int a; 在xxx.cpp中#include<xxx.h> 再定义 int a; 赋不赋初值无所谓,之后该全局变 ...

  5. scp命令的简单使用

    简介: scp是 secure copy的缩写, 是linux系统下基于ssh登陆进行安全的远程文件拷贝命令,Linux scp命令用于Linux之间复制文件和目录. 语法 scp [-1246BCp ...

  6. C++11 关键字 const 到底怎么用?

    Const 的作用及历史 const (computer programming) - Wikipedia 一.历史 按理来说,要想了解一件事物提出的原因,最好的办法就是去寻找当时的历史背景,以及围绕 ...

  7. 4、Redis基础

    redis性能 1.关于测试性能 官方自带的测试性能的工具 redis-benchmark 压力测试工具 #进行压力测试.需求:测试:100个并发连接,100000个请求 #redis-benchma ...

  8. JavaMoney规范(JSR 354)与对应实现解读

    一.概述 1.1 当前现状 当前JDK中用来表达货币的类为java.util.Currency,这个类仅仅能够表示按照**[ISO-4217]**描述的货币类型.它没有与之关联的数值,也不能描述规范外 ...

  9. 模板方法模式(Template Method Pattern)——复杂流程步骤的设计

    模式概述 在现实生活中,很多事情都包含几个实现步骤,例如请客吃饭,无论吃什么,一般都包含点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单 --> 吃东西 --> 买单. 在 ...

  10. Jenkins安全加固

    1.jenkins未授权访问 描述 jenkins不当配置可导致未授权访问管理控制台,可以通过脚本命令行执行系统命令.通过该漏洞,可以后台管理服务,通过脚本命令行功能执行系统命令,如反弹shell,w ...