枯燥无味的Elasticsearch检索参数字典

Posted 醉鱼!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枯燥无味的Elasticsearch检索参数字典相关的知识,希望对你有一定的参考价值。

2023年第一篇文章就这样水文了,拿出写了好久的《Elasticsearch查询请求时参数使用说明》水一次,懒惰了、兄弟们见谅,从发出来这篇文章开始,懒惰一去不回了兄弟们,让我们一起在新的一年更进一步。今年计划重心主要还是Elasticsearch与mysql,如果你想补充一下其他方面的知识欢迎留言评论

今天给大家带来的是Elasticsearch检索请求的最详细参数说明,把检索请求中经常用到的与不经常用的都展现出来,下面跟我一起来学习下吧

环境

  • macos10.14
  • elasticsearch 8.1.3
  • jdk8

添加测试数据

首先我们创建个索引

PUT /zfc-doc-000001

  "settings": 
    "index":
      "number_of_shards":3,
      "number_of_replicas":2
    
  ,
  "mappings": 
    "properties": 
      "title":
        "type":"keyword"
      ,
      "content":
        "type":"text"
      ,
      "createTime":
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" 
      ,
      "agreeNum":
        "type": "integer"
      ,
      "comment":
        "type": "nested",
        "properties": 
          "content":
            "type":"text"
          ,
          "name":
            "type":"keyword"
          ,
          "time":
            "type":"date",
            "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
          
        
      
    
  

加入测试数据

 "index" :  "_index" : "zfc-doc-000001", "_id" : "1"  
 "title" : "Java知识点大全","content":"java 泛型,基本类型有哪些","createTime": "2022-12-19","agreeNum":"99","comment":"name":"张三","content":"学习java必备","time":"2022-12-19 09:00:00" 
 "index" :  "_index" : "zfc-doc-000001", "_id" : "2"  
 "title" : "MySQL必知必会","content":"mysql 索引、事务、锁","createTime": "2022-12-18","agreeNum":"500","comment":["name":"张三","content":"学习mysql通俗易懂","time":"2022-12-18 09:00:00","name":"李四","content":"mysql 入门到精通必备的","time":"2022-12-18 10:00:00"  ]
 "index" :  "_index" : "zfc-doc-000001", "_id" : "3"  
 "title" : "Redis运维实战","content":"redis的rdb与aof","createTime": "2022-12-18","agreeNum":"300","comment":["name":"小红","content":"redis的备份","time":"2022-12-18 09:00:00","name":"李四","content": "redis 入门","time":"2022-12-18 15:00:00"  ]
 "index" :  "_index" : "zfc-doc-000001", "_id" : "4"  
 "title" : "Elasticsearch","content":"ES crud","createTime": "2022-12-17","agreeNum":"300","comment":["name":"小红","content":"es的基础SQL语法","time":"2022-12-17 09:00:00","name":"李四","content": "es 入门","time":"2022-12-18 16:00:00"  ]
 "index" :  "_index" : "zfc-doc-000001", "_id" : "5"  
 "title" : "常见MQ知识点汇总","content":"rabbitmq kafka rockmq activemq","createTime": "2022-12-16","agreeNum":"260","comment":["name":"小红","content":"kafka的基础概念","time":"2022-12-18 09:00:00","name":"李四","content": "事务消息","time":"2022-12-18 15:00:00"  ]

对于索引中mapping的字段为啥设置为nested类型,具体可以参考历史文章nested类型说明,具体链接给到下面

Nested嵌套对象类型还挺实用

下面还是简单的先学习一下_search API的使用,

Search API

GET zfc-doc-000001/_search

_search API 支持如下几种方式

GET /<_target>/_search

GET /_search

POST /<_target>/_search

POST /_search

其中<_target>是要检索的索引名称,要检索全部索引可以忽略此参数或者设置为*或者_all

支持的参数

参数有两种设置方式,一种是在请求路径参数中设置,另一种是在请求体中设置。如果两种都设置,则以请求路径参数为准

请求路径参数

  • allow_no_indices

    布尔值,使用模糊匹配或者索引别名搜索时,当目标索引不存在时,如果为true,返回空数据;如果为false,返回异常内容

    举例如下

    GET zfdc*/_search?allow_no_indices=true
    

    zfdc开头的索引进行检索,我们是没有该索引的,但是allow_no_indices=true,索引会返回空数据

    
      "took" : 0,
      "timed_out" : false,
      "_shards" : 
        "total" : 0,
        "successful" : 0,
        "skipped" : 0,
        "failed" : 0
      ,
      "hits" : 
        "total" : 
          "value" : 0,
          "relation" : "eq"
        ,
        "max_score" : 0.0,
        "hits" : [ ]
      
    
    

    修改**allow_no_indices=false**,返回报错内容

    GET zfdc*/_search?allow_no_indices=false
    
    
    # 返回如下
    
      "error" : 
        "root_cause" : [
          
            "type" : "index_not_found_exception",
            "reason" : "no such index [zfdc*]",
            "resource.type" : "index_or_alias",
            "resource.id" : "zfdc*",
            "index_uuid" : "_na_",
            "index" : "zfdc*"
          
        ],
        "type" : "index_not_found_exception",
        "reason" : "no such index [zfdc*]",
        "resource.type" : "index_or_alias",
        "resource.id" : "zfdc*",
        "index_uuid" : "_na_",
        "index" : "zfdc*"
      ,
      "status" : 404
    
    
    
  • allow_partial_search_results

    可选布尔值,如果为true,则在分片搜索超时时返回已经搜索的部分结果,如果为false,返回异常的报错

  • analyzers

    可选字符串,用于查询字符串的分析器。仅当q参数同时使用才有效

  • analyze_wildcard

    可选布尔值,如果为true,则会分析通配符或者前缀值,默认false仅当q参数同时使用才有效;

  • batched_reduce_size

    可选的整数值,协调节点上控制的分片数量,如果请求中存在大量的碎片,可以用该值当作保护机制,减少搜索请求的内存开销,默认值512

  • ccs_minimize_roundtrips

    可选布尔值,跨集群检索时协调节点与远程集群之间的网络往返,如果为true,网络往返将最小化

  • default_operator

    可选字符串,查询字符串时的默认运算符,支持ANDOR,默认OR,仅当q参数同时使用才有效;

  • df

    可选字符串,查询字符串时未制定字段前缀的情况下用做的默认值的字段,仅当q参数同时使用才有效;

  • docvalue_fields

    可选字符串,以逗号分隔的字段列表,返回文档值字段指定

  • expand_wildcards

    可选字符串、通配符模式下可以匹配的索引类型;默认open,支持allopenclosedhiddennone

  • explain

    可选布尔值,默认false,如果为true,可以返回计分的相关详细信息,类似mysqlexplain关键字

  • from

    可选、整数值,非负数,从0开始。也就是分页参数,默认情况下使用from+size两个参数控制,但是最大值是10000,如果超过10000可以使用search_after api 查询或者修改该参数值

  • ignore_throttled

    可选布尔值,默认true,如果为true,则在冻结时忽略具体索引、扩展索引或者别名索引

  • ignore_unavailable

    可选布尔值,默认false,如果是false,则在请求不存在的索引或者关闭的索引时返回错误

  • lenient

    可选布尔值,默认false,如果为true,将忽略查询字符串中基于格式的查询失败(例如向数字字段提供文本)

  • max_concurrent_shard_requests

    可选整数值,定义该请求同时执行的每个节点的并发分片请求数,这个值用于限制在集群中搜索的影响,限制并发分片请求的数量,默认**5**

  • pre_filter_shard_size

    可选整数值,定义一个阈值,如果搜索请求超过这个阈值就开启提前过滤分片

    我们查询数据有两个阶段,查询阶段和取回阶段,开启之后分为三个阶段,预过滤阶段、查询阶段和取回阶段

    例如,按照时间每天生成的索引,log-年月日,我们想查询当天的日志,开启之后,很多分片上根本不存在当天的数据,所以不需要去检索,也就是说在对分片检索之前先对分片进行检查一下是否包含被查询的数据范围,如果查询范围与分片持有的数据范围没有交集,就跳过该分片

  • preference

    可选字符串,用于搜索的节点和分片

    • ** _only_local**:仅在本地节点上执行检索
    • ** _local**:在本地节点的分片上进行检索,如果没有指定的节点可用、使用默认方法选择分片
    • ** _only_nodes:<node-id>,<node-id>**:仅对指定的节点id上进行检索,如果没有指定的节点可用使用默认方法选择分片
    • ** _prefer_nodes:<node-id>,<node-id>**:如果可能对指定的节点id上进行检索,如果没有节点可用使用默认方法选择分片
    • ** _shards:<shard>,<shard>**:仅对指定的分片上进行检索,可以将此值与其他的首选项组合使用,但是 _shards的值必须在前面,例如: _shards:2,3|_local
    • ** <custom-string>**:自定义的字符串值,任何一个不以 开头的字符串。如果集群的状态或者选中的分片没有发生改变,则使用与 <custom-string>相同的值使用同样的顺序路由到相同的分片上
  • q

    可选的请求参数查询字符串

    q参数会覆盖请求体中的查询参数,如果同时指定,请求体中的查询无效

    如果不指定字段名就是全部字段中检索

    /_search?q=字段名:值 
    
  • request_cache

    可选的布尔值,如果为true的话,则为size等于0的请求结果进行缓存,默认为索引的级别设置

  • rest_total_hits_as_int

    可选的布尔值,对响应结果hits.total在相应中是整数值还是对象的形式展现,默认false

  • routing

    可选字符串,根据自定义值将操作路由到特定的分片

  • scroll

    可选时间值,保留scroll搜索上下文的时间值

    默认情况下,该值不能超过**1d(24h)**,可以使用search.max_keep_alive修改集群中该设置

  • search_type

    可选字符串,设置搜索类型,计算相关评分的分布频率

    • ** query_then_fetch**:默认值,搜索的更快,但是可能评分不太精确
    • ** dfs_query_then_fetch**:全局所有分片检索,提高了评分的准确性,但是相应耗时增加了,导致搜索速度变慢
  • seq_no_primary_term

    可选布尔值,可以用作乐观锁,如果为true,则返回每个命中请求的最后一次修改的序列号和主键

  • size

    可选整数值,定义返回文档数量,默认10

    默认情况下,分页查询使用fromsize配合使用,默认最大返回10000条记录,如果要查询更多的官方建议是使用search_after

  • sort

    可选字符串,排序值,以逗号分割的<field>:<direction>列表

  • _source

    可选,指匹配的文档要返回的源文档字段设置,这些字段在相应的hits._source中展示,默认为true