elasticsearch基礎操作03
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