本文是Elasticsearch的入門文件,將會介紹ElasticSearch中的查詢操作和過濾操作。
執行查詢
現在我們已經看到了一些基本的搜尋引數,讓我們再深入查詢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)的新查詢,這個查詢可以被看作是基本的搜尋查詢(即針對特定欄位或者欄位集合進行的搜尋)。
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查詢允許我們使用布林邏輯將更小的查詢組合成更大的查詢。
此示例組成兩個match查詢,並返回地址中包含“mill”和“lane”的所有帳戶:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製程式碼
在上面的例子中,bool must子句指定了一個文件被認為是匹配的所有查詢。
相反,這個例子組成兩個match查詢,並返回地址中包含“mill”或“lane”的所有帳戶:
GET /bank/_search
{
"query": {
"bool": {
"should": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製程式碼
在上面的例子中,bool should子句指定了一個查詢列表,其中任何一個查詢都必須是true,才能被視為匹配的文件。
本示例組成兩個match查詢,並返回地址中既不包含“mill”也不包含“lane”的所有帳戶:
GET /bank/_search
{
"query": {
"bool": {
"must_not": [
{ "match": { "address": "mill" } },
{ "match": { "address": "lane" } }
]
}
}
}複製程式碼
在上面的例子中,bool must_not子句指定了一個查詢列表,其中任何一個查詢都不能被匹配。
我們可以在一個bool查詢中同時結合must,should和must_not子句。此外,我們可以在任何這些bool子句中編寫bool查詢來模擬任何複雜的多級布林邏輯。
這個例子返回所有40歲但ID不為(aho)的人的賬號:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "age": "40" } }
],
"must_not": [
{ "match": { "state": "ID" } }
]
}
}
}複製程式碼
執行過濾
在上一節中,我們跳過了一個稱為文件分數(搜尋結果中的_score欄位)的細節。分數是一個數字值,它是文件與我們指定的搜尋查詢匹配度的相對度量。分數越高,文件越相關,分數越低,文件就越不相關。
但查詢並不總是需要產生分數,特別是當它們僅用於“過濾”文件集時。 Elasticsearch檢測這些情況並自動優化查詢執行,以便不計算無用分數。
我們在前一節介紹的bool查詢也支援過濾子句,它允許使用查詢來限制將被其他子句匹配的文件,而不改變計算得分的方式。作為一個例子,我們來介紹一下範圍查詢(range query),它允許我們通過一系列值來過濾文件。這通常用於數字或日期過濾。
本示例使用bool查詢返回餘額在20000和30000之間的所有帳戶。換句話說,我們要查詢大於或等於20000且小於等於30000的帳戶。
GET /bank/_search
{
"query": {
"bool": {
"must": { "match_all": {} },
"filter": {
"range": {
"balance": {
"gte": 20000,
"lte": 30000
}
}
}
}
}
}複製程式碼
解析上述內容,bool查詢包含一個match_all查詢(查詢部分)和一個range查詢(過濾器部分)。我們可以將其他查詢替換為查詢和過濾器部分。在上述情況下,範圍查詢是非常有意義的,因為落入該範圍的文件全部匹配“相等”,即沒有文件比另一個文件更加匹配。
除了match_all,match,bool和range查詢之外,還有很多其他查詢型別可用,我們不在這裡介紹。由於我們已經對其工作原理有了一個基本的瞭解,所以將這些知識應用於其他查詢型別的學習和實驗並不難。