1. 程式人生 > >elasticsearch基礎操作03

elasticsearch基礎操作03

query filter

查詢數據:

Query API:

Query DSL:JSON based language for building complex queries

用於實現諸多類型的查詢操作,比如,simple term query,phrase ,range boolean,fuzzy等

ES的查詢操作執行分為兩個階段:

分散階段:

合並階段:

查詢方式:

向ES發起查詢請求的方式有兩種 :

1.通過Restful request API查詢,也稱為query string;

[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty'

2.通過發送REST request body進行;

[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '

> {

> "query":{ "match_all":{} }

> }'



多索引、多類型查詢:

/_search: 所有索引;

/INDEX_NAME/_search: 單索引

/INDEX1,INDEX2/_search: 多索引

/s*,t*/_search: 所有s,t開頭的索引

/students/class1/_search: 單類型搜索

/students/class1,class2/_search: 多類型搜索

Mapping和Analysis:

ES:對每一個文檔,會取得其所有域的所有值,生成一個名為"_all"的域;執行查詢時,如果在query_string未指定查詢的域,則

在_all域上執行查詢操作;

GET /_search?q="Xianglong"

GET /_search?q="Xianglong shiba zhang"

GET /_search?q=courses:"Xianglong shiba zhang"

GET /_search?q=courses:"Xianglong"

前兩個表示在_all域搜索

後兩個表示在指定的域上搜索

數據類型: string, numbers,boolean,dates

查看指定類型的mapping示例:

[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_mapping/class1?pretty'


ES中搜索的數據廣義上可被理解為兩類:

types: exact

full-text

精確值:指未經加工的原始值;在搜索時進行精確匹配;

full-text:用於引用文本中數據; 判斷文檔在多大程度上匹配查詢請求;即評估文檔與用戶請求查詢的相關度;

為了完成full-text搜索,ES必須首先分析文本,並創建出倒排索引;倒排索引中的數據還需要“正規化”為標準格式;

分詞

正規化

即分析

分析需要由分析器進行: analyzer,

分析器由三個組件構成: 字符過濾器,分詞器、分詞過濾器

ES內置的分析器:

standard analyzer:

simple analyzer

whitespace analyzer

language analyzer

分析器不僅在創建過引時用到;在構建查詢時也會用到;

Query DSL:

request body:

分成兩類:

query dsl: 執行full-text查詢時,基於相關度來評判其區配結果;

查詢執行過程復雜,且不會被緩存;

filter dsl:執行exact查詢時,基於其結果為“yes”或"no"進行評判;

速度快,且結果緩存;

filter dsl:

term filter: 精確匹配包含指定term的文檔;

查詢語句結構:

{

QUERY_NAME:{

AGGUMENT:VALUE,

AGGUMENT:VALUE,...

}

}

{

QUERY_NAME:{

FIELD_NAME: {

ARGUMENT: VALUE,...

}

}

}

示例:

[root@linux-node1 ~]# curl -XGET 'localhost:9200/students/_search?pretty' -d '{

> query:{

> "term":{"name":"Guo"}

> }

> }'

{

"took" : 49,

"timed_out" : false,

"_shards" : {

"total" : 5,

"successful" : 5,

"failed" : 0

},

"hits" : {

"total" : 0,

"max_score" : null,

"hits" : [ ]

}

}


terms filter: 用於多值精確匹配

{ "terms":{"name":["GUO","Rong"]}}

range filters:用於在指定的範圍內查找數值或時間。

{ "range":

"age":{"gte":15,

"lte":25

}

}

exists and missing filters:

{"exists":{

"age":25

}

}

boolean filter:

基於boolean的邏輯來合並多個filter子句:

must: 其內部所有的子句條件必須同時匹配,即and:

must:{

"term":{"age":25}

"term":{"gender":"Female"}

}

must_not: 其所有子句必須不匹配,即not

should: 至少有一個子句匹配,即or

QUERY DSL:

match_all Query:

用於匹配所有文檔,沒有指定任何query,默認即為match_all query.

{"match_all":{}}

match Query:

在幾乎任何域上執行full-text或exact-value 查詢

如果執行full-text查詢,首先對查詢時的語句做分析;

{“match”:{"students":"Guo"}}

如果執行exact-value查詢,搜索精確值,此時,建議使用過濾,而非查詢;

{"match": {"name":"Guo"}}

multi_match Query:

用於在多個域上執行相同的查詢:

{

“multi_match”:

"query": full-text search

"filed":{"filed1","filed2"}

}

{

"multi_match":

"query":{

"students":"Guo"

}

"filed":{

"name",

"description"

}

}

bool query:

基於boolean邏輯合並多個查詢語句: 與bool filter不同的是,查詢子句不是返回"yes"或"no",而是其計算出的匹配度分值。

因此,boolean query會為各子句合並其score:

合並filter和query:

{

"filterd":{

query:{"match":{"gender":"Female"}}

filter:{"term":{"age"}:25}}

}

}

查詢語句語法檢查:

GET /INDEX/_validate/query?explain&pretty

{

......

}


elasticsearch基礎操作03