ElasticSearch6(6.2.4)

https://www.elastic.co/guide/en/elasticsearch/reference/current ElasticSearch官方文檔

命令選項

  • elasticsearch
    • -d 後臺運行
    • -p 指定pid文件
    • -E 配置屬性<KeyValuePair>
    • -v --verbose
    • -q --quiet
    • -s --silent

啓動中止

  • 啓動
    • 直接啓動 bin/elasticsearch [-d] [-E <KeyValuePair>] [-p pidfile]
    • 服務管理命令啓動
  • 中止 (正常中止 從集羣中移除--sync事務日誌到磁盤--執行其餘相關清理活動)(SIGTERM信號 control-C)
    • 直接啓動中止 kill [-15|-SIGTERM] pid
    • 服務管理命令中止
    • Elasticsearch虛擬機出現重大錯誤(包括OOM,虛擬機內部錯誤以及嚴重IO錯誤)時,Elasticsearch會嘗試記入日誌而且中止虛擬機,會返回致命錯誤性質的狀態碼
      • 128 JVM內部錯誤
      • 127 OOM
      • 126 棧溢出
      • 125 未知虛擬機錯誤
      • 124 嚴重IO錯誤
      • 1 未知嚴重錯誤

GET

_cat 查看集羣狀態

  • _cat/health 集羣健康狀態
  • _cat/nodes 集羣節點及其狀態
  • _cat/indices 集羣索引及其狀態java

  • _nodes 能夠查看節點信息
  • _nodes/stats 查看節點狀態
  • _nodes/stats/process 查看節點運行狀態node

  • /index_name[/_doc]/_search 搜索api
    • /index_name/_search?sort=field:acs&pretty rest請求url方式 參數名=參數值 , &分割
    • response
      • took 執行搜索毫秒數
      • timed_out 是否超時 超時會將已經獲取的結果聚合返回
      • _shards 搜索分片信息
        • total 搜索總分片數
        • skipped
        • 失敗分片數
      • hits 搜索結果
        • total 匹配搜索條件的總命中數
        • max_score 最高相關性得分
        • hits 實際搜索結果數組
          • _index 文檔索引
          • _type 文檔類型
          • _id 文檔id元數據
          • sort 排序
          • _score 相關性得分
          • _source 文檔元數據
    • /index_name/_search {searchBody} 請求體搜索 (domain-specific language)DSL 請求體
  • GET /index_name/_doc/id 檢索api
    • types 在新的ElasticSearch版本中已經準備移除,ElasticSearch以後的版本會將 GET /index_name/type/id api改成 GET /index_name/_doc/id

POST (Http Header:"Content-Type:application/json")

  • /index_name/_doc {body} 索引文檔,自行生成文檔id
  • /index_name/_doc/id/_update 更新文檔(應用更改部分,從新索引)
  • /index_name/_update_by_query {update[Script],searchBody} 根據查詢條件更新文檔
  • /index_name/_delete_by_query {searchBody} 根據條件刪除文檔
  • /index_name/_doc/_bulk {opt1}{body1}{opt2}{body2}... 批量操做bulk

PUT

  • /index_name [{body}] 建立索引api [索引內容 配置、字段]
  • /index_name/_doc/id {body} 指定id索引文檔

DELETE

  • DELETE /index_name 刪除索引api
  • DELETE /index/_doc/id 刪除id對應文檔

參數

v vv vvv 詳細輸出
pretty 格式化輸出
refresh 將緩存內容更新到索引
filter_path 能夠過濾處指定信息linux

查詢請求體

  • query 查詢
    • match_all 查詢所有文檔
    • match 將查詢輸入標準化後進行匹配
    • match_phrase 短語匹配 查詢包含有序的term的文檔
    • bool
      • must 布爾查詢,必須
      • should 布爾查詢,符合加相關性得分
      • must_not 排除
    • range 範圍搜索 (如數值、日期)
      • gt
      • gte
      • lt
      • lte
      • ranges[{range1},{range2}...] 按範圍分組 aggs中
  • filter 過濾 能夠嵌入到查詢條件中
  • aggs/aggregations 聚合 {"aggs":{"agg1":{"agg_fun1":{{"fun1"},"order":{"agg2":"asc/desc"}},"aggs":{"agg2":{{"agg_fun2"}}}}}}
    • terms 以字段term聚合
    • avg 求平均值
  • size 返回搜索結果條數
  • from 搜索結果偏移量 從0開始 (各分片獲取前 from+size個文檔,返回一個簡單文檔信息給調用節點,該節點聚合結果,而後向各分片獲取詳細文檔,而後返回給客戶端)
  • sort 排序
  • _source ["field1","field2"]返回文檔字段shell

  • field
  • orderexpress

配置 通常能夠在運行時使用集羣設置更新api設定 配置文件中通常只要包含節點制定的配置(如node.name)及加入集羣用的配置(如cluster.name)

環境變量配置

  • 系統配置文件 Debian /etc/default/elasticsearch , RPM /etc/sysconfig/elasticsearch
  • $ES_HOME ElasticSearch解壓根目錄
  • $ES_HOME/bin 默認bin目錄
  • $ES_PATH_CONF $ES_HOME/config 配置文件目錄
  • $ES_HOME/plugins 插件目錄位置json

    elasticsearch.yml Elasticsearch配置 yaml格式 可用${...}使用環境變量 使用${prompt.text}/${prompt.secret}在啓動Elasticsearch時輸入設定值(後臺啓動時不可用)

  • path.data $ES_HOME/data 數據目錄
    • 數據文件能夠存儲到多個路徑(單個分片的文件會所有存儲到同一路徑),用法
      • path:
      • data:
      • - path1
      • - path2
      • - path3
  • path.logs $ES_HOME/logs 日誌目錄
  • path.repo 共享文件系統位置
  • path.scripts $ES_HOME/scripts script文件目錄
  • cluster.name 集羣名稱 節點會加入同名稱的節點
  • node.name 節點名稱
  • network.host Elasticsearch監聽地址 默認監聽本地迴路,(可使用同一個Elasticsearch啓動多個節點測試Elasticsearch集羣能力)
  • discover.zen.ping.unicast.hosts 完成節點間發現和主節點選舉(默認會掃描本地迴路的9300-9305端口發現同主機其餘節點自動完成集羣)
  • discover.zen.ping.unicast.hosts:
                - (host1/domian1)[:port]
                - (host2/domian2)[:port]
               (沒有指定端口時,將默認端口爲transport.profiles.default.port 返回到transport.tcp.port)
                (解析到多個ip地址的主機名稱會嘗試全部被解析的地址)
  • discovery.zen.minimum_master_nodes 指定組成集羣必須能發現的能成爲主節點的最小節點數量,用來防止數據丟失,沒有這個設定時,在集羣出現網絡問題時有腦裂爲兩個獨立集羣的風險,腦裂會致使數據丟失,爲避免腦裂,應設爲
  • discovery.zen.minimum_master_nodes:(master_eligible_nodes / 2) + 1
  • discovery.type 發現集羣其餘節點方式
  • index.unassigned.node_left.delayed_timeout 當一個節點關閉時,分配進程開始分配複製分片到集羣其餘節點的等待時間。bootstrap

    keystore 對支持的屬性,能夠在啓動Elasticsearch的用戶下使用keystore方式設置屬性,對其餘用戶進行隱藏,keystore修改的屬性在下次重啓Elasticsearch時纔會生效

  • elasticsearch-keystore
    • create
    • list
    • add (可使用--stdin使用管道輸入)
    • removeapi

      jvm.options Elasticsearch JVM配置

  • 每行分割配置
  • 只有空格的行忽略
  • 以#開始的爲註釋
  • 以-開始的會單獨做爲JVM參數應用
  • 以數字開頭,接冒號 num:/num-:/num1-num2: 在JVM版本匹配數字時應用
  • 其餘的行無效
  • 也能夠經過 ES_JAVA_OPTS環境變量設置JVM選項(不支持JAVA_OPTS環境變量)
  • 生產環境較推薦的JVM參數設定規則
    • 最小堆大小Xms和最大堆大小Xmx設爲相同
    • Elasticsearch分配了越大的堆空間,就有越大的緩存可用,可是過大的堆大小一樣會產生過長的垃圾回收暫停問題
    • 設置最大堆大小不要超過物理內存的50%,確保核心系統緩存有足夠的物理內存來進行緩存
    • 設置的最大堆大小不要超過JVM壓縮指針截止點,確切的截止點在接近32G處變化。
    • 保持處於零基壓縮的閾值如下會更好,確切的閾值不一樣,在大多數系統上,26G是安全的,而在一些系統上能超過30G,能夠經過在啓動Elasticsearch時使用JVM選項 -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode進行驗證。
  • -XX:HeapDumpPath 設置OOM時適合的的堆dump文件存儲位置,默認沒有配置,會將堆存到Elasticsearch進程的工做目錄。
  • jvm.options中默認配置的gc日誌在64M時進行輪替,保留32個日誌文件(2G多)
  • es.enforce.bootstrap.checks 強制啓動檢測數組

    log4j2.properties Elasticsearch日誌配置 log4j 2

  • ${sys:es.logs.baes_path} path.logs
  • ${sys:es.logs.cluster_name} cluster.name
  • ${sys:es.logs.logs.node_name} node.name(若存在)
  • 配置首尾不能有空格
  • 配置日誌級別
    • 命令行輸入 -E <name of logging hierarchy>=<level>
    • elasticsearch.yml配置 <name of logging hierarchy>: <level>
    • 集羣設定 PUT /_cluster/settings {"transient":{"<name of logging hierarchy>": "<level>" }}
    • log4j2.properties配置
      • logger.<unique_identifier>.name = <name of logging hierarchy>
      • logger.<unique_identifier>.level = <level>緩存

        系統配置 理想狀態下,Elasticsearch能夠單獨在一臺服務器上運行,可以獨佔服務器的全部資源,須要對操做系統進行一些配置使Elasticsearch可以比默認狀況下獲取更多的資源,在應用這些設置以前應該通過慎重考慮

  • 文件句柄限制(pam模組):
    • 解壓安裝:臨時設置ulimit,長久設置/etc/security/limits.conf
    • 包管理工具安裝RPM/Debian:服務配置文件:/etc/sysconfig/elasticsearch(RPM)|/etc/default/elasticsearch(Debian)|systemd架構的服務配置文件
  • 不使用交換區:交換區使用磁盤緩存,一旦使用到交換區,極大影響程序運行效率,對於Elasticsearch,可能引發垃圾回收時間長,節點響應緩慢,甚至斷開集羣鏈接。配置文件中可使用bootstrap.memory_lock: true使用mlockall阻止Elasticsearch使用交換區,進行配置之後,當嘗試分配超過可用內存時,可能致使JVM或shell session退出(可能失敗緣由有用戶沒有鎖內存的權限|臨時文件目錄文件系統掛載時使用了noexec標記)。
  • Elasticsearch使用了大量的文件描述符/文件句柄(Linux/Windows),超過可用的文件描述符會致使有很大可能會形成數據丟失,須要確保Elasticsearch可用的文件描述符爲65536或者更高(/proc/pid/fd/)
  • Elasticsearch使用內存文件映射(mmapfs(/proc/pid/map_files|/proc/pid/maps))(像linux緩存經常使用文件同樣),虛擬內存映射max_map_count系統預設值太低,容易引發OOM,須要增大系統max_map_count到262144,使用systemctl指令或sysctl.conf配置文件設置vm.max_map_count=262144
  • Elasticsearch對不一樣的操做類型使用了大量的線程池,一旦有須要時就能建立新的線程很重要。須要確保啓動Elasticsearch的用戶最少可以建立4096個線程。
  • 同時啓動Java security manager時,JVM默認會緩存解析的主機名稱,當環境中的DNS解析變動時,但願能改變默認JVM行爲,能夠經過添加networkaddress.cache.ttl=<timeout>到Java security policy中。啓動Java security manager時,當主機名稱解析失敗時,默認會緩存10秒,能夠經過添加networkaddress.cache.negative.ttl=<timeout>到Java security policy中修改。<timeout>爲0不緩存,爲-1永久緩存。
  • 這些配置不正確時(除了文件句柄配置),開發環境下會在日誌文件中輸出警告,而且仍然容許啓動,一旦修改瞭如network.host這樣的網絡配置,Elasticsearch就會判斷進入了生產環境,前面的警告會變爲異常,這些異常會阻止節點的啓動,這是保證你不會因爲一個配置不當的服務器丟失數據的重要安全措施。

啓動檢驗

  • 在Elasticsearch以前的版本中,不適當的重要配置會在日誌中輸出警告,爲了確保這些設置受到應有的關注,Elasticsearch在啓動時進行檢查。檢查會比較Elasticsearch變量和系統設置與操做安全的值比較,若是處於開發模式,任何失敗的檢測會在日誌輸出警告,若是處於生產模式,任何檢測失敗會致使Elasticsearch啓動失敗。這些檢查老是強制阻止Elasticsearch運行在一個不正確的配置下。
  • 堆大小檢查 當設置不相等的初始堆大小和最大堆大小,在系統使用過程當中,容易由於調整對大小形成停頓。另外,若是bootstrap.memory_lock內存鎖啓用,JVM在啓動時會鎖上初始堆的大小。若是初始堆大小與最大堆大小不等,在改變大小堆大小後不是全部的JVM堆內存都被鎖上。
  • 文件描述符檢查 在Unix中,一切都是文件,構建文件描述符追蹤打開的文件,Elasticsearch須要大量的文件描述符。
  • 內存鎖檢查 在JVM進行主垃圾回收時,會涉及到堆中的每一頁,若是有任何內存頁被交換到磁盤交換區,都必須被交換回內存,這會致使大量磁盤和實體內存間的數據交換。一種禁止使用交換區的方式是使用mlockall,能夠在Elasticsearch設置bootstrap.memory_lock使JVM鎖上堆內存,可是實際沒有鎖上時也會經過檢測,檢測節點bootstrap.memory_lock是否實際啓用。
  • 最小線程數檢查 在Elasticsearch的請求進入階段,會分割爲多個請求,並在階段完成時在不一樣的線程池處理。Elasticsearch用不一樣的線程池執行不用的任務。最少要保證Elasticsearch進程能建立4096個線程(可能還須要增長root用戶的限制)。
  • 最大虛擬內存檢查 Elasticsearch符合Lucene使用mmap將索引數據的部分直接映射到Elasticsearch的地址空間,因此可以直接經過內存而不是JVM堆快速訪問肯定的索引數據。爲了使其生效,Elasticsearch應該具備不被限制的地址空間,須要設置limits.conf的as(address space limit)爲unlimited。
  • 最大文件大小檢查 片斷文件組成獨立的分片,事物日誌能夠變得很大(超過幾個GB)。在限制了最大文件大小的系統上,這會致使寫入失敗。最安全的方法是解除最大文件大小的限制。
  • 虛擬內存映射打開上限檢查 使用mmap是有效的,Elasticsearch一樣須要建立大量內存映射區域的能力,Elasticsearch須要至少262144的內存映射區域(個數,不是大小),須要設置vm.max_map_count。
  • JVM檢查 (對於OpenJDK)從OpenJDK能獲取到兩種JVM:the client JVM 、the server JVM。對於一樣的Java字節碼,他們會使用不一樣的編譯器產生不一樣的機器碼。The client JVM 針對啓動時間和內存使用進行了調整,而 the server JVM 作了最大性能優化。兩個虛擬機之間的差別是巨大的。不能在 the client JVM 中運行Elasticsearch。(也支持OracleJDK)。在現代系統中,默認是 the server VM。
  • 使用串行收集器檢查 OpenJDK對不一樣的工做負荷提供了多種垃圾回收器。串行收集器最適合於單邏輯CPU或極小的堆,他們都不適合運行Elasticsearch。使用串行收集器會給Elasticsearch的性能產生毀滅性的影響。串行收集器檢測會確保Elasticsearch沒有配置使用串行收集器。要經過串行收集器檢測,不能使用串行收集器啓動Elasticsearch(不管是來自你使用的JVM的默認收集器仍是經過使用 -XX:+UseSerialGC 明確指定)。Elasticsearch的jvm配置默認使用CMS收集器(jvm.options)。
  • 系統調用過濾器檢查 Elasticsearch 根據操做系統安裝各類風格的系統調用過濾器(如Linux上的seccomp安全計算模式secure computing mode)。安裝這些系統調用過濾器是爲了防止執行系統調用相關的防護機制的仍以代碼選擇執行阻止Elasticsearch fork的能力。系統調用過濾器檢測確保系統調用過濾器可用,而且被成功安裝。要經過系統調用過濾器檢測,必須同時修復全部阻止安裝的系統調用過濾器的錯誤系統配置(經過檢查日誌),或者設置bootstrap.system_call_filter爲false並自負風險。
  • 錯誤時及OOM錯誤時檢查 JVM選項 OnError 和 OnOutOfMemoryError 容許在JVM發生重大錯誤OnError或一個OutOfMemoryError時執行任意命令。而默認狀況下,Elasticsearch系統調用過濾器(seccomp)被啓用而且這些過濾器阻止fork。使用 OnError 和 OnOutOfMemoryError 與系統調用過濾器是兼容的。OnError 和 OnOutOfMemoryError 檢測會在這些JVM參數中的任一個使用同時啓用系統調用過濾器時阻止Elasticsearch啓動。經過檢測的方式是不啓用OnError或OnOutOfMemoryError,取代的,在Java 8u92版本使用JVM 標記 ExitOnOutOfMemoryError ,在seccomp啓用時,任意forking都不被支持。
  • 先行版檢查 OpenJDK提供即將發佈的發行版的先行可獲取快照版本。這些發行版不適用於生產環境。先行版檢測偵測先行快照。爲了經過檢測,必須使用JVM的發行版來啓動Elasticsearch
  • G1GC檢查 JDK8 HotSpot JVM 的早期版本使用G1收集器時會致使索引損壞,早於JDK 8u40的HotSpot版本會受到影響。
  • all permission檢查 確保不會將 java.security.AllPermission 授予Elasticsearch。授予 all permission 權限至關於禁用了安全管理器。

開發模式和生產模式

  • 使用非單節點發現的非迴路地址會判別爲生產模式。默認Elasticsearch使用迴路地址的http和(內部)通訊傳輸,這方便於平常開發,而對於生產環境,是無用的。爲了加入一個集羣,Elasticsearch必須能經過傳輸通訊訪問。一個節點須要bind到一個非迴路地址,而且不使用單節點發現來加入一個非迴路地址集羣。http和傳輸(tcp)地址使用http.host和transport.host指定,出於測試目的,使用一個經過http可訪問的單節點而不觸發生產模式是頗有效的。
  • 單節點模式:一些用戶須要bind到外部tcp端口來測試他們的 transport client的用法,爲了這種情形,Elasticsearch提供了single-node的發現模式 discovery.type = single-node ,這種情形下,一個節點會選舉自身爲主節點而且不會加入一個有其餘任何節點的集羣。在生產環境使用單節點而可以避過強制啓動檢查時,能夠設定JVM選項 es.enforce.bootstrap.checks=true 強制執行啓動檢查。當處於這種特殊情形時,強烈鼓勵啓動檢查(爲了生產環境的穩定)。

API交互

  • Elasticsearch REST API 在HTTP上使用JSON進行交互
  • 除非特別指定,能夠經過REST API使用如下的API:
    • Multiple Indices
    • Date math support in index names
    • Common options
    • URL-based access control

Multiple Indices

  • 多數APIs經過執行multiple indices支持index參數,使用簡單的test1,test2,test3標記(或者_all表明所有索引)。也支持通配符,例如:test**testte*t*test*,而且能夠進行排除(-),如:test*,-test3
  • 全部的multi indices API支持下面的url query string參數
    • ignore_unavailable 控制當有任何指定的索引不可用(包括不存在的或關閉的索引)時,是否忽略。能夠指定爲true|false
    • allow_no_indices 控制一個索引通配表達式沒有實際的索引時,是否失敗。能夠指定爲true|false。例如使用通配表達式foo而且沒有以foo開始的可用索引會根據這個設定決定請求是否爲fail。這個設定一樣適用於_all,或沒有指定索引。在一個別名指向一個關閉的索引時,這個設定一樣能夠應用到別名
    • expand_wildcards 控制索引通配表達式拓展的具體類型。若是指定爲open則通配表達式僅在打開的索引上拓展,若是指定爲closed則通配表達式僅在關閉的索引上拓展,同時指定(open,closed)指定拓展到所有索引。若是指定爲none,關閉通配,若是指定爲all通配表達式拓展到所有索引(與指定爲open,closed相同)
    • 以上參數的默認值取決於使用的api
  • 單索引APIs如Document APIs和single-index alias APIs不支持 multiple indices

Date math support in index names

  • 日期計算索引名稱解析容許你搜索一個時間序列範圍內的索引,而不是搜索全部時間序列索引並在結果中過濾,或者維護別名。限定索引數量減小集羣搜索負載,而且提升搜索性能。例如,若是搜索你每日的錯誤日誌,可使用一個 date math name template 來限定搜索到兩天內。
  • 幾乎全部具備 index 參數的索引,在index參數中支持時間序列。一個時間序列索引名經過如下形式得到
    <static_name{date_math_expr{date_format|time_zone}}>
    • static_name 爲名稱的靜態文本部分
    • date_math_expr 爲動態計算時間的動態時間表達式
    • date_format 爲日期計算應該使用的格式選項,默認爲YYYY.MM.dd
    • time_zone 時區選項,默認爲utc
  • 你必須使用方括號包圍你的date math index name expressions,而且全部特殊字符應該被URI encoded,例如
# GET /<logstash-{now/d}>/_search
GET /%3Clogstash-%7Bnow%2Fd%7D%3E/_search
{
  "query" : {
    "match": {
      "test": "data"
    }
  }
}
  • 日期數值字符URI編碼
< %3C
> %3E
/ %2F
{ %7B
} %7D
+ %2B
: %3A
, %2C
  • 下面的形式顯示解析 22rd March 2024 noon utc 爲當前時間,解析到不一樣日期數值索引名格式和最終解析的索引名
    |Expression|Resolves to|
    |-|-|
    |<logstash-{now/d}>|logstash-2024.03.22|
    |<logstash-{now/M}>|logstash-2024.03.01|
    |<logstash-{now/M{YYYY.MM}}>|logstash-2024.03|
    |<logstash-{now/M-1M{YYYY.MM}}>|logstash-2024.02|
    |<logstash-{now/d{YYYY.MM.dd|+12:00}}>|logstash-2024.03.23|
  • 爲了在索引名稱模板的靜態部分使用字符{},使用反斜槓\來escape,如<elastic\\{ON\\}-{now/M}> 解析到 elastic{ON}-2024.03.01
  • 下面是一個搜索過去三天Logstash索引的搜索請求例子,嘉定索引使用默認Logstash索引名稱格式logstash-YYYY.MM.dd
# GET /<logstash-{now/d-2d}>,<logstash-{now/d-1d}>,<logstash-{now/d}>/_search
GET /%3Clogstash-%7Bnow%2Fd-2d%7D%3E%2C%3Clogstash-%7Bnow%2Fd-1d%7D%3E%2C%3Clogstash-%7Bnow%2Fd%7D%3E/_search
{
  "query" : {
    "match": {
      "test": "data"
    }
  }
}

Common options

  • 下列選項能夠應用到REST APIs
    • Pretty Results 當進行任何請求時附加一個?pretty=true,返回的JSON將會格式化梅花(只在調試時使用)。另外一個選項是設置?format=yaml將會使返回值使用一個(有時)可讀性更好的yaml格式
    • Human readable output 將返回更適合人類的統計值(如"exists_time": "1h""size": "1kb")和社和計算機的(如"exists_time_in_millis": 3600000"size_in_bytes":1024)。人類可讀的值能夠在query string中添加?human=false來關閉。當統計結果被一個監控工具消費而不是被人類消費時,這是有意義的。默認的human標記爲false
    • Date Math 多數參數接受一個格式化的時間值,例如在range queries中的gtlt,或daterange aggregations中的fromto會理解日期計算。表達式以一個指定時間開始,包括now或者一個以||結尾的日期字符串。固定時間可使用如下一個或多個計算表達式:
      • +1h - 加一小時
      • -1d - 減一天
      • /d - 取整到最近一天
      • 支持的時間單位和持續時間的時間單位不一樣,支持的時間單位爲:
        |||
        |-|-|
        |y|年|
        |M|月|
        |w|周|
        |d|天|
        |h|時|
        |H|時|
        |m|分|
        |s|秒|
      • 假設now2001-01-01 12:00:00,一些例子爲:
      now+1h
      now in milliseconds plus one hour. Resolves to: 2001-01-01 13:00:00 
      now-1h
      now in milliseconds minus one hour. Resolves to: 2001-01-01 11:00:00 
      now-1h/d
      now in milliseconds minus one hour, rounded down to UTC 00:00. Resolves to: 2001-01-01 00:00:00 
      2001.02.01\|\|+1M/d
      2001-02-01 in milliseconds plus one month. Resolves to: 2001-03-01 00:00:00
    • Response Filtering 全部REST APIs接受一個filter_path參數用來減小Elasticsearch返回的響應。這個參數使用逗號分割使用.標記的過濾表達式列表:
      GET /_search?q=elasticsearch&filter_path=took,hits.hits._id,hits.hits._score
    Responds:
    {
    "took" : 3,
    "hits" : {
      "hits" : [
        {
          "_id" : "0",
          "_score" : 1.6375021
        }
      ]
    }
    }
    • 一樣支持使用*通配符匹配所有字段或字段名的部分
      GET /_cluster/state?filter_path=metadata.indices.*.stat*
    {
    "metadata" : {
      "indices" : {
        "twitter": {"state": "open"}
      }
    }
    }
    • **通配符用來包含不知道字段確切路徑時的字段名。例如,咱們可使用如下請求返回Lucene版本的每一個片斷:
      GET /_cluster/state?filter_path=routing_table.indices.**.state
    Responds:
    {
    "routing_table": {
      "indices": {
        "twitter": {
          "shards": {
            "0": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
            "1": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
            "2": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
            "3": [{"state": "STARTED"}, {"state": "UNASSIGNED"}],
            "4": [{"state": "STARTED"}, {"state": "UNASSIGNED"}]
          }
        }
      }
    }
    }
    • 一樣可使用前綴-排除一個或多個字段:GET /_count?filter_path=-_shards
    Responds:
    {
    "count" : 5
    }
    • 爲了更多的控制,能夠在一個表達式中同時使用包含和排除過濾。這種狀況下,會先應用排除過濾,而後再進行包含過濾
      GET /_cluster/state?filter_path=metadata.indices.*.state,-metadata.indices.logstash-*
    Responds:
    {
    "metadata" : {
      "indices" : {
        "index-1" : {"state" : "open"},
        "index-2" : {"state" : "open"},
        "index-3" : {"state" : "open"}
      }
    }
    }
    • 注意Elasticsearch有時直接返回字段未加工的值,就像_source字段。若是你想要過濾_source字段,你應該考慮結合已經存在的_source參數與filter_path參數:
    POST /library/book?refresh
    {"title": "Book #1", "rating": 200.1}
    POST /library/book?refresh
    {"title": "Book #2", "rating": 1.7}
    POST /library/book?refresh
    {"title": "Book #3", "rating": 0.1}
    GET /_search?filter_path=hits.hits._source&_source=title&sort=rating:desc
    {
    "hits" : {
      "hits" : [ {
        "_source":{"title":"Book #1"}
      }, {
        "_source":{"title":"Book #2"}
      }, {
        "_source":{"title":"Book #3"}
      } ]
    }
    }
    • Flat Settings flat_settings標記影響設定列表的翻譯。當flat_settings標記爲true,設定會返回扁平化格式:GET twitter/_settings?flat_settings=true
    Returns:
    {
    "twitter" : {
      "settings": {
        "index.number_of_replicas": "1",
        "index.number_of_shards": "1",
        "index.creation_date": "1474389951325",
        "index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
        "index.version.created": ...,
        "index.provided_name" : "twitter"
      }
    }
    }
    • flat_settings標記爲false時,settings會返回更人類可讀的結構化格式:GET twitter/_settings?flat_settings=false
    Returns:
    {
    "twitter" : {
      "settings" : {
        "index" : {
          "number_of_replicas": "1",
          "number_of_shards": "1",
          "creation_date": "1474389951325",
          "uuid": "n6gzFZTgS664GUfx0Xrpjw",
          "version": {
            "created": ...
          },
          "provided_name" : "twitter"
        }
      }
    }
    }
    • flat_settings默認設定爲false
    • Parameters REST參數(當使用HTTP,map to HTTP URL parameters)聽從使用下劃線風格的約定
    • Boolean Values 全部的REST APIs參數(包括請求參數和JSON body)支持使用"true"和"false"指定布爾值true|false。全部其餘的值會引發一個錯誤。
    • Number Values 全部的REST APIs支持數值參數爲字符串,支持JSON自然數值類型。
    • Time units 在任何須要指定持續時間時,例如timeout參數,持續時間必須指定單位,如2d爲兩天,支持的單位以下:
      |||
      |-|-|
      |d|天|
      |h|小時|
      |m|分|
      |s|秒|
      |ms|毫秒|
      |micros|微秒|
      |nanos|納秒|
    • Byte size units 當須要指定數據字節大小時,如設定一個buffer size 參數時,必須指定值的單位,如10kb。注意單位使用1024進位,支持的單位爲:
      |||
      |-|-|
      |b|Bytes|
      |kb|Kilobytes|
      |mb|Megabytes|
      |gb|Gigabytes|
      |tb|Terabytes|
      |pb|Petabytes|
    • Unit-less quantities 無數量單位意味着使用單位"bytes"或"Hertz"或"meter"或"long tonne",若是數量過大,ELasticsearch將會輸出像10m爲10,000,000或者7k爲7,000。這意味着當87時,仍會輸出87。這些是支持的乘數:
      |||
      |-|-|
      |‘’|Single|
      |k|Kilo|
      |m|Mega|
      |g|Giga|
      |t|Tera|
      |p|Peta|
    • Distance Units 但須要指定距離時(如Geo Distance Query中的distance參數)若是沒有指定時默認單位爲米。距離能夠指定爲其餘單位,如"1km"或"2mi"(2miles)。單位列表爲:
      |||
      |-|-|
      |Mile|mi|miles|
      |Yard|yd|yards|
      |Feet|ft|feet|
      |Inch|in|inch|
      |Kilometer|km|kilometers|
      |Meter|m|meters|
      |Centimeter|cm|centimeters|
      |Millimeter|mm|millimeters|
      |Nautical mile|NM,nmi|natuicalmiles|
    • Fuzziness 一些queries和APIs支持運行模糊匹配的參數,使用fuzziness參數,當querying textkeyword字段,fuzziness會解釋爲Levenshtein Edit Distance——使一個字符串與另外一個字符串相同須要改變的字符數。fuzziness參數能夠像這樣指定:012最大容許的修改數量,AUTO局域term長度生成一個edit distance。能夠選擇AUTO:[low],[high]指定low and high distance arguments,若是沒有指定,默認值爲3和6,即AUTO:3,6,在如下長度將會:
      • 0..2 必須徹底匹配
      • 3..5 容許單個edit
      • >5 容許兩個edits
      • 一般偏向與用AUTO做爲fuzziness的值
    • Enabling stack trances 當請求返回一個錯誤時,Elasticsearch默認不會包含錯誤的stack trace,你能夠經過設置error_trace url參數爲true來開啓這個行爲。例如,當發送一個非法的size參數到_search API:
      POST /twitter/_search?size=surprise_me
    響應會像這樣
    {
    "error" : {
      "root_cause" : [
        {
          "type" : "illegal_argument_exception",
          "reason" : "Failed to parse int parameter [size] with value [surprise_me]"
        }
      ],
      "type" : "illegal_argument_exception",
      "reason" : "Failed to parse int parameter [size] with value [surprise_me]",
      "caused_by" : {
        "type" : "number_format_exception",
        "reason" : "For input string: \"surprise_me\""
      }
    },
    "status" : 400
    }
    • 可是當設置error_trace=true
      POST /twitter/_search?size=surprise_me&error_trace=true
    響應爲
    {
    "error": {
      "root_cause": [
        {
          "type": "illegal_argument_exception",
          "reason": "Failed to parse int parameter [size] with value [surprise_me]",
          "stack_trace": "Failed to parse int parameter [size] with value [surprise_me]]; nested: IllegalArgumentException..."
        }
      ],
      "type": "illegal_argument_exception",
      "reason": "Failed to parse int parameter [size] with value [surprise_me]",
      "stack_trace": "java.lang.IllegalArgumentException: Failed to parse int parameter [size] with value [surprise_me]\n    at org.elasticsearch.rest.RestRequest.paramAsInt(RestRequest.java:175)...",
      "caused_by": {
        "type": "number_format_exception",
        "reason": "For input string: \"surprise_me\"",
        "stack_trace": "java.lang.NumberFormatException: For input string: \"surprise_me\"\n    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)..."
      }
    },
    "status": 400
    }
    • Request body in query string 對於不接受非POST請求的庫,能夠經過設置請求體爲source query string 參數代替。當使用這種方式,source_content_type參數也應該傳遞一個媒體類型的值,來制定source的格式,如application/json
    • Content-Type Requirements 請求體發送的內容類型必須使用Content-Type頭指定,請求頭的值必須映射到該API支持的一種格式。多數API支持JSON,YAML,CBOR和SMILE。bulk和multi-searchAPIs支持NDJSON(Newline delimited JSON),JSON和SMILE,而其餘類型將會致使錯誤響應。另外,當使用source query string參數時內容類型必須使用source_content_type query string參數指定。

URL-based access conrtol

  • 許多用戶使用一個基於URL的訪問控制代理來安全的訪問Elasticsearch索引,對於multi-search,multi-get和bulk請求,用戶能夠選擇在URL中指定一個索引,也能夠在每一個請求體中的單獨請求中指定。這讓基於URL的訪問控制受到挑戰。防止用戶覆蓋URL中指定的索引,在elasticsearch.yml文件中添加設置rest.action.multi.allow_explicit_index: false,默認值爲true當指定爲false時,Elasticsearch將拒絕在請求體中指定一個肯定索引的請求
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息