大多数search API都是可以操作多个索引的,除了explain API。

当执行一个search API时,可以指定routing参数,去搜索特定的主分片及其副本分片。routing参数值可以是个以逗号分隔的字符串列表,这样es会搜索每个字符串对应的分片。

默认情况下,会以轮询方式把搜索请求发送到副本组中的某个分片,我们可以修改动态配置cluster.routing.use_adaptive_replica_selection为true,指定请求转发至最优。类似于nginx的负载均衡策略。

put /_cluster/settings
{
    "transient": {
        "cluster.routing.use_adaptive_replica_selection": true
    }
}

注意,这个更改是针对es中所有索引的,不是针对某个索引,改动会对所有索引生效。学习完settings后再来看下。

search API可以在request body中用timeout指定超时时间。也可以通过修改search.default_search_timeout值来设置默认超时时间,该值默认为-1,表示不超时。

put /_cluster/settings
{
    "transient": {
        "search.default_search_timeout": "5s"
    }
}

可以使用标准任务取消机制取消search请求。

Search

如上所述,如果想一次搜索多个索引,可以用逗号分隔索引名。如果想搜索所有的索引,则看直接使用_all替代具体的索引名。

get /twitter,bank/_search

get _all/_search

Request Body Search

from、size既可以放在request uri上,也可以放在request body中。from+size的值必须小于等于index.max_result_window(值默认是10000)的值,否则会报错"Result window is too large, from + size must be less than or equal to: [10000]"。from+size不能超过10000,那么分页查询时10000之后的文档该怎么办呢?查看下面的Sroll API和Search After API。

es除支持常规字段排序外,还支持按照数组字段或多值字段对文档进行排序。mode选项控制使用哪个数组值进行排序,mode值可以为:

min:选择最小值

max:选择最大值

sum:选择总值。仅适用于数字类型的数组字段

avg:选择平均值。仅适用于数字类型的数组字段

median:选择中位数

示例:

post /twitter/_doc/1?refresh
{
    "product": "chocolate",
    "price": [20, 4]
}

post /twitter/_search
{
    "query" : {
        "term" : { "product" : "chocolate" }
    },
    "sort" : [
        {"price" : {"order" : "asc", "mode" : "avg"}}
    ]
}

es还支持按一个或多个嵌套对象内的字段进行排序。用nested选项,值可以是:

path:定义要排序的嵌套对象。实际排序字段必须是此嵌套对象中的直接字段。必需

filter:

nested:这一块在学习完nested之后再回来看。

es还支持按自定义脚本排序。示例:

假如twitter索引中有三个文档,分别是{"age":18,"pay":20000}、{"age":19,"pay":15000}、{"age":20,"pay":10000},按照age*pay*某个常量/变量倒排:

get twitter/_search
{
    "sort" : {
        "_script" : {
            "type" : "number",
            "script" : {
                "lang": "painless",
                "source": "doc.age.value * doc.pay.value * params.factor",
                "params" : {
                    "factor" : 1.1
                }
            },
            "order" : "asc"
        }
    }
}

search默认情况下会返回文档的所有字段,可以设置_source值来指定想要的字段(支持通配符),示例:

get twitter/_search
{
    "_source": ["age*", "pay*"],
    "query": {
        "match_all": {}
    }
}

_source值还可以直接设为false,这样将只返回文档元数据,而不返回任何文档字段,示例:

get twitter/_search
{
    "query": {
        "match_all": {}
    },
    "_source": false
}

Script Fields

search还允许通过script_fields在匹配文档的某些字段上进行函数操作,并返回操作结果,示例:

get twitter/_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "doc.pay.value * 2"
            }
        },
        "test2" : {
            "script" : {
                "lang": "painless",
                "source": "doc.pay.value * params.factor",
                "params" : {
                    "factor" : 2.0
                }
            }
        }
    }
}

Scroll

通常情况下,search请求会返回一页数据,而就像关系型数据库中的游标一样,我们可以用scroll API获取大量甚至是所有的文档。scroll API不是用于实时用户请求的,而是用于处理大量数据的,例如,将一个索引中的数据全部复制到另一个索引中,即reindex。scroll请求返回的结果反映了初始search请求时索引的状态,像快照一样。对文档的后续更改(增删改)只会影响以后的search请求。为了使用scroll,初始search请求应该在request uri上指定scroll参数,告诉es它应该保持search context存活多长时间。示例:

get /twitter/_search?scroll=1m
{
    "size": 3,
    "query": {
        "match_all" : {}
    }
}

scroll=1m,表示让scroll context存活1分钟。

这里学习有点困难,先跨过,以后再回来学。

search请求的返回结果中默认是不带文档版本号的,如果想要的话,可以在request uri上或者request body中指定version为true,示例:

get /twitter/_search
{
    "version": true
}

Search After

scroll API不建议用于实时用户请求,search_after参数通过提供实时游标来解决此问题。想法是使用上一页的结果来帮助检索下一页。search_after并不能想获取哪一页就能获取哪一页的数据,而是并行滚动多个查询。感觉没啥用,用的时候再学。

Multi Search API

关键字是_msearch,发一次请求,就可执行多个针对不同索引、不同搜索条件的搜索请求。就好像bulk API一样。示例:

get /_msearch
{"index" : "twitter"}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 1}
{"index" : "bank"}
{"query" : {"match" : {"age":18}}, "from" : 0, "size" : 1}

多搜索请求中的每个子请求由两行组成,第一行用index关键字指定要搜索的索引,第二行是搜索条件、分页信息等。多搜索请求响应是一个数组,数组元素依次是每个子请求的响应。

The msearch’s max_concurrent_searches request parameter can be used to control the maximum number of concurrent searches the multi search api will execute. This default is based on the number of data nodes and the default search thread pool size.

Count API

检索某索引或某些索引中符合特定条件的文档有多少个,没啥用。

官网文档这一块有很多API感觉都没有用,此文档没有介绍,如果真用到的话,去官网学习后在补充到这里。

es第三篇:Search APIs的更多相关文章

  1. ElasticSearch入门 第三篇:索引

    这是ElasticSearch 2.4 版本系列的第三篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  2. SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  3. 前端第三篇---前端基础之JavaScript

    前端第三篇---前端基础之JavaScript 一.JavaScript概述 二.JavaScript的基础 三.词法分析 四.JavaScript的内置对象和方法 五.BOM对象 六.DOM对象 七 ...

  4. 白日梦的ES笔记三:万字长文 Elasticsearch基础概念统一扫盲

    目录 一.导读 二.彩蛋福利:账号借用 三.ES的Index.Shard及扩容机制 四.ES支持的核心数据类型 4.1.数字类型 4.2.日期类型 4.3.boolean类型 4.4.二进制类型 4. ...

  5. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  6. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  9. 我的屌丝giser成长记-研三篇

    进入研三以来,基本都是自己的自由时间了,从导师的项目抽离出来,慢慢的都交给师弟他们来负责.研三的核心任务就是找工作以及写毕业论文,因为有导师科研基金项目成果作为支撑,所以自己的论文没什么可担心,一切都 ...

随机推荐

  1. REDIS与MEMCACHED的区别(转)

    出处:http://www.blogjava.net/paulwong/archive/2013/09/06/403746.html 如果简单地比较Redis与Memcached的区别,大多数都会得到 ...

  2. 解决Emoji存储MySQL报错问题

    在解决之前,得先说明一下为什么会出现报错,Emoji表情占用4个字节,但是MySQL数据库UTF-8编码最多只能存储3个字节,就会导致存储不进去 如何解决Emoji存储问题 mysql 的 utf8编 ...

  3. Spring AOP 详解 【转】

      此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另 ...

  4. iOS应用开发之CoreData[转]

    我目前的理解,CoreData相当于一个综合的数据库管理库,它支持sqlite,二进制存储文件两种形式的数据存储.而CoreData提供了存储管理,包括查询.插入. 删除.更新.回滚.会话管理.锁管理 ...

  5. Json字符串转对象和转List集合操作

    对象POJO和JSON互转 public class JsonUtil { /** * JSON 转 POJO */ public static <T> T getObject(Strin ...

  6. 洛谷 4051 [JSOI2007]字符加密(后缀数组)

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  7. mybatis-初步使用

    最近因为业务各方面的原因,需要使用mybatis,所以系统的学习和总结下. 其实mybatis出来已经很久了,貌似大家伙用得也挺顺手的样纸,好歹我先不评价,还是先了解了解mybatis的样纸,后续再添 ...

  8. [LeetCode 题解]: Triangle

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a tr ...

  9. Centos 7 修改默认的运行级别

    Runlevel System State 0 Halt the system 1 Single user mode 2 Basic multi user mode 3 Multi user mode ...

  10. [Erlang12] Mnesia分布式应用

    [Erl_Question12] Mnesia分布式应用 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个节点挂了进,对外接口不影响). 方案一: Er ...