• es第三篇:Search APIs


    大多数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之后的文档该怎么办呢?用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
                    }
                }
            }
        }
    }

    Search Type

    可选类型有query_then_fetch和dfs_query_then_fetch,默认是query_then_fetch。这里有一个常问的面试题,es是怎么处理请求的?

    query_then_fetch,请求处理分为两个阶段。接受请求的节点称为coordinator,即协调节点。第一阶段,协调节点转发查询请求至所有的分片。每个分片都根据查询条件生成本地分片的结果排序列表,并向协调节点返回一定量的数据,注意这里的数据不是文档,而是文档的id和score。第二个阶段,协调节点接收到所有分片返回的数据,按照score排序之后,根据id去对应的分片请求文档。

    dfs_query_then_fetch,与query_then_fetch唯一的不同是,在各分片向协调节点返回数据之前,会先计算好总的词条频率下发至各分片,这样各分片就会在相同的基础条件上计算score,协调节点根据score排序会更准确一些。

    Search After

    search_after主要用于解决from+size>10000的情况,实现是使用上一页的结果来帮助检索下一页。

    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感觉都没有用,此文档没有介绍,如果真用到的话,去官网学习后在补充到这里。

  • 相关阅读:
    019_linuxC++之_函数模板引入
    018_linuxC++之_抽象类的引入
    017_linuxC++之_多态的引入
    《将博客搬至CSDN》
    016_linuxC++之_多重继承
    013_linuxC++之_派生类中权限的调整
    015_linuxC++之_覆写
    014_linuxC++之_不同类型的继承
    012_linuxC++之_类的继承定义
    011_linuxC++之_继承的引入
  • 原文地址:https://www.cnblogs.com/koushr/p/5873425.html
Copyright © 2020-2023  润新知