ElasticSearch API约定

  • API约定

    Web中的应用程序编程接口(API)是一组函数调用或其他编程指令,用于访问该特定Web应用程序中的软件组件。例如,Facebook API通过访问来自Facebook的数据或其他功能来帮助开发人员创建应用程序;它可以是出生日期或状态更新。
    Elasticsearch提供了一个REST API,JSON可以通过HTTP访问该API。Elasticsearch使用一些约定,我们现在将对其进行讨论。
  • 多个索引

    API中的大多数操作(主要是搜索操作和其他操作)用于一个或多个索引。这仅需执行一次查询,即可帮助用户在多个位置或所有可用数据中进行搜索。许多不同的符号用于在多个索引中执行操作。在本章中,我们将讨论其中的一些。
    逗号分隔符号
    
    POST /index1,index2,index3/_search
    请求正文
    {
       "query":{
          "query_string":{
             "query":"any_string"
          }
       }
    }
    
    响应
    来自index1,index2,index3的JSON对象中包含any_string。
  • _all所有索引的关键字

       
    POST /_all/_search
    请求正文
    {
       "query":{
          "query_string":{
             "query":"any_string"
          }
       }
    }
    
    响应
    来自所有索引的JSON对象,其中包含any_string。
  • 通配符(*,+,–)

     
    POST /school*/_search
    请求正文
    {
       "query":{
          "query_string":{
             "query":"CBSE"
          }
       }
    }
    
    响应
    来自所有索引的JSON对象,这些索引始于其中包含CBSE的school。
    另外,您也可以使用以下代码-
    
    POST /school*,-schools_gov/_search
    请求正文
    {
       "query":{
          "query_string":{
             "query":"CBSE"
          }
       }
    }
    
    响应
    JSON对象来自所有以“school”开头的索引,但不是来自school_gov并包含CBSE的索引。
    还有一些URL查询字符串参数-
    ignore_unavailable - 如果URL中不存在一个或多个索引,则不会发生错误或不会停止任何操作。例如,school索引存在,但book_shops不存在。
    
    POST /school*,book_shops/_search
    请求正文
    {
       "query":{
          "query_string":{
             "query":"CBSE"
          }
       }
    }
    
    
    请求正文
    {
       "error":{
          "root_cause":[{
             "type":"index_not_found_exception", "reason":"no such index",
             "resource.type":"index_or_alias", "resource.id":"book_shops",
             "index":"book_shops"
          }],
          "type":"index_not_found_exception", "reason":"no such index",
          "resource.type":"index_or_alias", "resource.id":"book_shops",
          "index":"book_shops"
       },"status":404
    }
    
    考虑以下代码-
    
    POST /school*,book_shops/_search?ignore_unavailable = true
    请求正文
    {
       "query":{
          "query_string":{
             "query":"CBSE"
          }
       }
    }
    
    响应(无error)
    来自所有索引的JSON对象,这些索引始于其中包含CBSE的学校。
  • allow_no_indices

    如果带有通配符的URL没有索引,则此参数的true值将防止错误。例如,没有以schools_pri开头的索引-
    
    POST /schools_pri*/_search?allow_no_indices = true
    请求正文
    {
       "query":{
          "match_all":{}
       }
    }
    
    响应(无错误)
    
    {
       "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
       "hits":{"total":0, "max_score":0.0, "hits":[]}
    }
    
  • expand_wildcards

    此参数决定通配符是否需要扩展为开放索引或封闭索引,或同时执行这两者。该参数的值可以是open和close的,也可以是无。
    例如,关闭索引school-
    
    POST /schools/_close
    
    响应
    
    {
        "acknowledged": true,
        "shards_acknowledged": false,
        "indices": {}
    }
    
    考虑以下代码-
    
    POST /school*/_search?expand_wildcards=closed
    
    请求正文
    
    {
       "query":{
          "match_all":{}
       }
    }
    
    响应
    
    {
        "error": {
            "root_cause": [
                {
                    "type": "index_closed_exception",
                    "reason": "closed",
                    "index_uuid": "laIr7lx_RmKmdMwsTaxauA",
                    "index": "school"
                }
            ],
            "type": "index_closed_exception",
            "reason": "closed",
            "index_uuid": "laIr7lx_RmKmdMwsTaxauA",
            "index": "school"
        },
        "status": 400
    }
    
  • 索引名称中的日期数学支持

    Elasticsearch提供了根据日期和时间搜索索引的功能。我们需要以特定格式指定日期和时间。例如,accountdetail-2020.12.30,索引将存储2020年12月30日的银行帐户详细信息。可以执行数学运算以获取特定日期或日期和时间范围的详细信息。
    日期数学索引名称的格式-
    
    <static_name{date_math_expr{date_format|time_zone}}>
    /<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search
    
    static_name是表达式的一部分,在每个日期数学索引(如帐户明细)中都保持不变。date_math_expr包含数学表达式,该数学表达式像now-2d一样动态确定日期和时间。date_format包含将日期写入诸如YYYY.MM.dd之类的索引中的格式。如果今天是2020年12月30日,则<accountdetail-{now-2d {YYYY.MM.dd}}>将返回accountdetail-2020.12.28。
    表达式 -> 解析为
    • <accountdetail-{now-d}> -> accountdetail-2020.12.29
    • <accountdetail-{now-M}> -> accountdetail-2020.11.30
    • <accountdetail-{now{YYYY.MM}}> -> accountdetail-2020.12
    现在,我们将看到Elasticsearch中提供的一些常用选项,这些选项可用于获取指定格式的响应。
  • 美化结果

    我们可以通过添加URL查询参数(即pretty = true)来在格式良好的JSON对象中获得响应。
    
    POST /schools/_search?pretty=true
    
    请求正文
    
    {
       "query":{
          "match_all":{}
       }
    }
    
    响应
    
    ……………………..
    {
       "_index" : "schools", "_type" : "school", "_id" : "1", "_score" : 1.0,
       "_source":{
          "name":"Central School", "description":"CBSE Affiliation",
          "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
          "location": [31.8955385, 76.8380405], "fees":2000,
          "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5"
       }
    }
    ………………….
    
  • 人类可读的输出

    此选项可以将统​​计响应更改为人类可读形式(如果human=true)或计算机可读形式(如果human=false)。例如,如果human=true,则distance_kilometer=20KM;如果human = false,则distance_meter=20000,此时需要其他计算机程序使用响应。
  • 响应过滤

    我们可以通过将它们添加到field_path参数中来过滤对较少字段的响应。例如,
    
    POST /schools/_search?filter_path=hits.total
    
    请求正文
    
    {
       "query":{
          "match_all":{}
       }
    }
    
    响应
    
    {"hits":{"total":3}}