本文翻譯自:www.elastic.co/guide/en/el…html
本文是Elasticsearch的入門文檔,將會介紹ElasticSearch中的查詢語言。bash
Elasticsearch提供了一種可用於執行查詢的特定於域的JSON風格的的語言。這被稱爲查詢DSL。查詢語言至關全面,第一次接觸可能會讓人恐慌,但實際學習的最佳方式是從幾個基本的例子開始。elasticsearch
回到咱們的最後一個例子,咱們執行了這個查詢:ide
GET /bank/_search
{
"query": { "match_all": {} }
}複製代碼
解析上面的內容,查詢部分告訴咱們什麼是查詢定義,而match_all部分就是咱們要運行的查詢類型。 match_all查詢只是搜索指定索引中的全部文檔。學習
除了query參數外,咱們還能夠傳遞其餘參數來影響搜索結果。在上面的例子中,咱們經過sort,這裏咱們傳遞size:ui
GET /bank/_search
{
"query": { "match_all": {} },
"size": 1
}複製代碼
請注意,若是未指定size,則默認爲10。spa
此示例執行match_all並返回文檔11至20:翻譯
GET /bank/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}複製代碼
from參數(基於0)指定要從哪一個文檔索引開始,size參數指定從from參數開始返回多少文檔。實現分頁搜索結果時,此功能很是有用。請注意,若是未指定from,則默認爲0。code
此示例執行match_all,並按結果按降序按賬戶餘額排序,並返回前10名(默認大小)文檔。htm
GET /bank/_search
{
"query": { "match_all": {} },
"sort": { "balance": { "order": "desc" } }
}複製代碼
如今咱們已經看到了一些基本的搜索參數,咱們再來看一下查詢DSL。咱們先來看看返回的文檔字段。默認狀況下,完整的JSON文檔做爲全部搜索的一部分返回。這被稱爲源(搜索匹配中的_source字段)。若是咱們不但願返回整個源文檔,咱們有能力僅從源代碼中請求幾個字段被返回。
此示例顯示如何從搜索中返回兩個字段account_number和balance(_source內部):
GET /bank/_search
{
"query": { "match_all": {} },
"_source": ["account_number", "balance"]
}複製代碼
請注意,上述示例簡單地減小_source字段。它仍然只返回一個名爲_source的字段,但在其中只包含字段account_number和balance。
若是你有SQL技術背景,上述內容在概念上與SQL SELECT FROM字段列表有些類似。
如今咱們來看看查詢部分。前面,咱們已經看到了如何使用match_all查詢來匹配全部文檔。如今咱們來介紹一個稱爲match query的新查詢,能夠將其視爲基本的字段搜索查詢(即針對特定字段或一組字段進行搜索)。此示例返回的賬號爲20:
GET /bank/_search
{
"query": { "match": { "account_number": 20 } }
}複製代碼
此示例返回在地址中包含術語「mill」的全部賬戶:
GET /bank/_search
{
"query": { "match": { "address": "mill" } }
}複製代碼
此示例返回在地址中包含術語「mill」或「lane」的全部賬戶:
GET /bank/_search
{
"query": { "match": { "address": "mill lane" } }
}複製代碼
此示例是match(match_phrase)的變體,它返回全部包含地址中的「mill lane」短語的賬戶:
GET /bank/_search
{
"query": { "match_phrase": { "address": "mill lane" } }
}複製代碼
如今介紹一下bool query。 bool query
容許咱們使用布爾邏輯將較小的查詢組合成較大的查詢。
此示例組成兩個match查詢,並返回包含「mill」和「lane」的全部賬戶在地址中:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製代碼
在上面的例子中,bool must子句指定文檔被認爲是匹配的全部查詢必須爲true。
相比之下,此示例組成兩個match查詢,並返回地址中包含「mill」或「lane」的全部賬戶:
GET /bank/_search
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製代碼
在上面的例子中,bool should子句指定一個查詢列表,匹配文檔中的任意一個爲true。
此示例組成兩個匹配查詢,並返回在地址中既不包含「mill」也不包含「lane」的全部賬戶:
GET /bank/_search
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製代碼
在上面的示例中,bool must_not子句指定了一個查詢列表,對於一個被認爲是匹配的文檔,它們都不是true。
咱們能夠在一個bool查詢中同時結合使用must,should和must_not子句。此外,咱們能夠在任何這些bool子句中組合bool查詢,以模擬任何複雜的多級布爾邏輯。
此示例返回全部40歲,但state不是ID的人的全部賬戶:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}複製代碼