elasticsearch search API

本文參考官方提供api提煉出來的html

https://www.elastic.co/guide/en/elasticsearch/reference/current/search.htmlgit

URI查詢github

elasticsearch能夠經過提供請求參數純粹使用URI來執行搜索請求。算法

GET twitter/_search?q=user:kimchy
名稱 描述

qsql

查詢字符串(映射到query_string查詢,有關詳細信息,請參閱 查詢字符串查詢)。數據庫

dfapi

在查詢中未定義字段前綴時使用的默認字段。數組

analyzer緩存

分析查詢字符串時要使用的分析器名稱。app

analyze_wildcard

是否應分析通配符和前綴查詢。默認爲false

batched_reduce_size

應在協調節點上一次減小的分片結果數。若是請求中潛在的分片數量很大,則應將此值用做保護機制,以減小每一個搜索請求的內存開銷。

default_operator

要使用的默認運算符能夠是AND或 OR。默認爲OR

lenient

若是設置爲true將致使忽略基於格式的失敗(如向數字字段提供文本)。默認爲false。

explain

對於每一個命中,包含如何計算命中得分的解釋。

_source

設置爲false禁用_source字段檢索。您還可使用_source_include&檢索部分文檔_source_exclude( 有關詳細信息,請參閱請求正文文檔)

stored_fields

每一個匹配返回的文檔的選擇性存儲字段,逗號分隔。不指定任何值將致使沒有字段返回。

sort

排序執行。能夠是fieldName或 fieldName:asc/ 的形式fieldName:desc。fieldName能夠是文檔中的實際字段,也能夠是特殊_score名稱,表示基於分數的排序。能夠有幾個sort參數(順序很重要)。

track_scores

排序時,設置爲true仍然跟蹤分數並將其做爲每一個匹配的一部分返回。

track_total_hits

設置爲false禁用跟蹤與查詢匹配的匹配總數。(有關詳細信息,請參閱索引排序)。默認爲true。

timeout

搜索超時,將搜索請求限制在指定的時間值內執行,並使用在到期時累積的點擊數進行保釋。默認爲無超時。

terminate_after

在達到查詢執行將提早終止時,爲每一個分片收集的最大文檔數。若是設置,響應將具備一個布爾字段,terminated_early以指示查詢執行是否實際上已終止。默認爲no terminate_after。

from

從命中的索引開始返回。默認爲0

size

要返回的點擊次數。默認爲10

search_type

要執行的搜索操做的類型。能夠是 dfs_query_then_fetchquery_then_fetch。默認爲query_then_fetch。有關能夠執行的不一樣搜索類型的更多詳細信息,請參閱 搜索類型

allow_partial_search_results

false若是請求將產生部分結果,則設置爲返回總體故障。默認爲true,這將容許在超時或部分失敗的狀況下得到部分結果。

Requet Body搜索

Requet Body請求能夠在其主體內使用包括查詢DSL的搜索DSL來執行。

GET /twitter/_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

timeout

搜索超時,將搜索請求限制在指定的時間值內執行,並使用在到期時累積的點擊數進行保釋。使用「 搜索取消」 編輯機制在達到超時後取消搜索請求。默認爲無超時。請參閱時間單位編輯

from

從某個偏移量中檢索命中。默認爲0

size

要返回的點擊次數。默認爲10。若是您不關心某些匹配,但只關注匹配和/或聚合的數量,將值設置爲0有助於提升性能。

search_type

要執行的搜索操做的類型。能夠是 dfs_query_then_fetchquery_then_fetch。默認爲query_then_fetch。請參閱搜索類型以獲取更多

request_cache

設置爲truefalse啓用或禁用對於size爲0的請求的搜索結果的緩存,即聚合和建議(未返回頂部命中)。請參閱Shard請求緩存

allow_partial_search_results

false若是請求將產生部分結果,則 設置爲返回總體故障。默認爲true,這將在超時或部分失敗的狀況下容許部分結果。

terminate_after

在達到查詢執行將提早終止時,爲每一個分片收集的最大文檔數。若是設置,響應將具備一個布爾字段,terminated_early以指示查詢執行是否實際上已終止。默認爲no terminate_after。

batched_reduce_size

應在協調節點上一次減小的分片結果數。若是請求中潛在的分片數量很大,則應將此值用做保護機制,以減小每一個搜索請求的內存開銷。

Query

搜索請求主體中的查詢元素容許使用查詢DSL定義查詢。

GET /_search
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

From/Size

結果的分頁能夠經過使用fromsize 參數來完成。該from參數定義要獲取的第一個結果的偏移量。該size參數容許您配置要返回的最大命中數。

GET /_search
{
    "from" : 0, "size" : 10,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Sort

容許在特定字段上添加一個或多個排序。每種類型也能夠反轉。排序是在每一個字段級別定義的,具備用於_score按分數排序的特殊字段名稱,以及_doc按索引順序排序。

GET /my_index/_search
{
    "sort" : [
        { "post_date" : {"order" : "asc"}},
        "user",
        { "name" : "desc" },
        { "age" : "desc" },
        "_score"
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

在_score上排序時,順序默認爲desc,在排序其餘任何內容時默認爲asc

asc

按升序排序

desc

按降序排序

Elasticsearch支持按數組或多值字段進行排序。 mode選項控制選擇哪一個數組值以對其所屬的文檔進行排序。 mode選項能夠具備如下值

min

選擇最低值。

max

選擇最高價值。

sum

使用全部值的總和做爲排序值。僅適用於基於數字的數組字段。

avg

使用全部值的平均值做爲排序值。僅適用於基於數字的數組字段。

median

使用全部值的中位數做爲排序值。僅適用於基於數字的數組字段。

Elasticsearch還支持按一個或多個嵌套對象內的字段進行排序。 嵌套字段支持的排序具備嵌套排序選項,具備如下屬性:

path 定義要排序的嵌套對象。實際排序字段必須是此嵌套對象中的直接字段。按嵌套字段排序時,此字段是必填字段。
filter 嵌套路徑中的內部對象應與之匹配的過濾器,以便經過排序考慮其字段值。常見的狀況是在嵌套過濾器或查詢中重複查詢/過濾。默認狀況下,沒有nested_filter活動。
nested 與頂級相同,nested但適用於當前嵌套對象中的另外一個嵌套路徑。
POST /_search
{
   "query" : {
      "term" : { "product" : "chocolate" }
   },
   "sort" : [
       {
          "offer.price" : {
             "mode" :  "avg",
             "order" : "asc",
             "nested": {
                "path": "offer",
                "filter": {
                   "term" : { "offer.color" : "blue" }
                }
             }
          }
       }
    ]
}
POST /_search
{
   "query": {
      "nested": {
         "path": "parent",
         "query": {
            "bool": {
                "must": {"range": {"parent.age": {"gte": 21}}},
                "filter": {
                    "nested": {
                        "path": "parent.child",
                        "query": {"match": {"parent.child.name": "matt"}}
                    }
                }
            }
         }
      }
   },
   "sort" : [
      {
         "parent.child.age" : {
            "mode" :  "min",
            "order" : "asc",
            "nested": {
               "path": "parent",
               "filter": {
                  "range": {"parent.age": {"gte": 21}}
               },
               "nested": {
                  "path": "parent.child",
                  "filter": {
                     "match": {"parent.child.name": "matt"}
                  }
               }
            }
         }
      }
   ]
}

Source過濾

容許控制_source每次點擊返回字段的方式。

默認狀況下,_source除非您使用了stored_fields參數或_source禁用了字段,不然操做將返回字段的內容。

您能夠_source使用如下_source參數關閉檢索:

要禁用_source檢索設置爲false

GET /_search
{
    "_source": false,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
GET /_search
{
    "_source": {
        "includes": [ "obj1.*", "obj2.*" ],
        "excludes": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Script Fields

容許爲每一個匹配返回腳本評估(基於不一樣的字段)

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "script_fields" : {
        "test1" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * 2"
            }
        },
        "test2" : {
            "script" : {
                "lang": "painless",
                "source": "doc['price'].value * params.factor",
                "params" : {
                    "factor"  : 2.0
                }
            }
        }
    }
}

腳本字段能夠處理未存儲的字段(my_field_name在上面的例子中),並容許返回要返回的自定義值(腳本的評估值)。

Doc value Fields

容許爲每一個匹配返回字段的doc值表示

GET /_search
{
    "query" : {
        "match_all": {}
    },
    "docvalue_fields" : [
        {
            "field": "my_ip_field",
            "format": "use_field_mapping"
        },
        {
            "field": "my_date_field",
            "format": "epoch_millis"
        }
    ]
}

Post filter 後過濾器

在已經計算聚合以後,將post_filter其應用於hits搜索請求最末端的搜索。

GET /shirts/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": { "brand": "gucci" }
      }
    }
  },
  "aggs": {
    "colors": {
      "terms": { "field": "color" }
    },
    "color_red": {
      "filter": {
        "term": { "color": "red" }
      },
      "aggs": {
        "models": {
          "terms": { "field": "model" }
        }
      }
    }
  },
  "post_filter": {
    "term": { "color": "red" }
  }
}

當你須要對搜索結果和聚合結果作不一樣的過濾時,你才應該使用 post_filter , 有時用戶會在普通搜索使用 post_filter 。

不要這麼作! post_filter 的特性是在查詢 以後 執行,任何過濾對性能帶來的好處(好比緩存)都會徹底失去。

在咱們須要不一樣過濾時, post_filter 只與聚合一塊兒使用。

Rescoring

從新排序能夠經過使用輔助(一般更昂貴)算法從新排序由query和和 post_filter階段返回的頂部(例如100-500)文檔來提升精度 ,而不是將昂貴的算法應用於索引中的全部文檔。

rescore它返回其結果,以經過處理總體搜索請求的節點進行排序以前請求是在每一個碎片執行。

目前,rescore API只有一個實現:查詢rescorer,它使用查詢來調整評分。

查詢rescorer僅對query和和 post_filter階段返回的Top-K結果執行第二個查詢。每一個分片上將檢查的文檔數量能夠經過window_size參數控制,默認值爲10。

默認狀況下,原始查詢和rescore查詢的分數將線性組合,以生成_score每一個文檔的最終結果。原始查詢和rescore查詢的相對重要性能夠 分別用query_weight和控制rescore_query_weight。二者都默認爲1

POST /_search
{
   "query" : {
      "match" : {
         "message" : {
            "operator" : "or",
            "query" : "the quick brown"
         }
      }
   },
   "rescore" : {
      "window_size" : 50,
      "query" : {
         "rescore_query" : {
            "match_phrase" : {
               "message" : {
                  "query" : "the quick brown",
                  "slop" : 2
               }
            }
         },
         "query_weight" : 0.7,
         "rescore_query_weight" : 1.2
      }
   }
}
分數模式 描述

total

添加原始分數和rescore查詢分數。默認值。

multiply

將原始分數乘以rescore查詢分數。對function query從新調整有用。

avg

平均原始分數和rescore查詢分數。

max

取最大原始分數和rescore查詢分數。

min

取最小原始分數和rescore查詢分數。

Scroll

search請求返回結果的單個「頁面」時,scroll API可用於從單個搜索請求中檢索大量結果(甚至全部結果),這與在傳統數據庫上使用遊標的方式很是類似。

scroll不是針對實時用戶請求,而是針對處理大量數據,例如爲了將一個索引的內容從新索引到具備不一樣配置的新索引中。

POST /twitter/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}
POST /_search/scroll
{
    "scroll" : "1m",
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
DELETE /_search/scroll
{
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
DELETE /_search/scroll/_all
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB

Multi Search API

多搜索API容許在同一API中執行多個搜索請求。它的端點是_msearch

請求的格式相似於批量API格式,並使用換行符分隔的JSON(NDJSON)格式。結構以下(若是特定搜索最終重定向到另外一個節點,則結構被特別優化以減小解析):

header \ n body \ n header \ n body \ n
GET twitter/_msearch
{}
{"query" : {"match_all" : {}}, "from" : 0, "size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}

使用模板

GET _msearch/template
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match\": { \"message\" : \"{{keywords}}\" } } } }", "params": { "query_type": "match", "keywords": "some message" } }
{"index" : "twitter"}
{ "source" : "{ \"query\": { \"match_{{template}}\": {} } }", "params": { "template": "all" } }
相關文章
相關標籤/搜索