1. 搜索語法入門
1.1query string search
無條件搜索所有
GET /book/_search
{
"took" : 969,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "book",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Bootstrap開發",
"description" : "Bootstrap是由Twitter推出的一個前臺頁面開發css框架,是一個非常流行的開發框架,此框架集成了多種頁面效果。此開發框架包含了大量的CSS、JS程序代碼,可以幫助開發者(尤其是不擅長css頁面開發的程序人員)輕鬆的實現一個css,不受瀏覽器限制的精美界面css效果。",
"studymodel" : "201002",
"price" : 38.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"bootstrap",
"dev"
]
}
},
{
"_index" : "book",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "java編程思想",
"description" : "java語言是世界第一編程語言,在軟件開發領域使用人數最多。",
"studymodel" : "201001",
"price" : 68.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"java",
"dev"
]
}
},
{
"_index" : "book",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "spring開發基礎",
"description" : "spring 在java領域非常流行,java程序員都在用。",
"studymodel" : "201001",
"price" : 88.6,
"timestamp" : "2019-08-24 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"spring",
"java"
]
}
}
]
}
}
解釋
took:耗費了幾毫秒
timed_out:是否超時,這裏是沒有
_shards:到幾個分片搜索,成功幾個,跳過幾個,失敗幾個。
hits.total:查詢結果的數量,3個document
hits.max_score:score的含義,就是document對於一個search的相關度的匹配分數,越相關,就越匹配,分數也高
hits.hits:包含了匹配搜索的document的所有詳細數據
1.2傳參
與http請求傳參類似
GET /book/_search?q=name:java&sort=price:desc
類比sql: select * from book where name like ’ %java%’ order by price desc
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "book",
"_type" : "_doc",
"_id" : "2",
"_score" : null,
"_source" : {
"name" : "java編程思想",
"description" : "java語言是世界第一編程語言,在軟件開發領域使用人數最多。",
"studymodel" : "201001",
"price" : 68.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"java",
"dev"
]
},
"sort" : [
68.6
]
}
]
}
}
1.3圖解timeout
GET /book/_search?timeout=10ms
全局設置:配置文件中設置 search.default_search_timeout:100ms。默認不超時。
2.multi-index 多索引搜索
2.1multi-index搜索模式
告訴你如何一次性搜索多個index和多個type下的數據
/_search:所有索引下的所有數據都搜索出來
/index1/_search:指定一個index,搜索其下所有的數據
/index1,index2/_search:同時搜索兩個index下的數據
/index*/_search:按照通配符去匹配多個索引
應用場景:生產環境log索引可以按照日期分開。
log_to_es_20190910
log_to_es_20190911
log_to_es_20180910
2.2初步圖解一下簡單的搜索原理
搜索原理初步圖解
3. 分頁搜索
3.1分頁搜索的語法
sql: select * from book limit 1,5
和 SQL 使用 LIMIT
關鍵字返回單個 page
結果的方法相同,Elasticsearch 接受 from
和 size
參數:
-
size
顯示應該返回的結果數量,默認是
10
-
from
顯示應該跳過的初始結果數量,默認是
0
顯示應該返回的結果數量,默認是 10
顯示應該跳過的初始結果數量,默認是 0
如果每頁展示 5 條結果,可以用下面方式請求得到 1 到 3 頁的結果:
GET /book/_search?size=5
GET /book/_search?size=5&from=5
GET /book/_search?size=5&from=10
3.2deep paging
什麼是deep paging
根據相關度評分倒排序,所以分頁過深,協調節點會將大量數據聚合分析。
deep paging 性能問題
1消耗網絡帶寬,因爲所搜過深的話,各 shard 要把數據傳遞給 coordinate node,這個過程是有大量數據傳遞的,消耗網絡。
2消耗內存,各 shard 要把數據傳送給 coordinate node,這個傳遞回來的數據,是被 coordinate node 保存在內存中的,這樣會大量消耗內存。
3消耗cup,coordinate node 要把傳回來的數據進行排序,這個排序過程很消耗cpu。 所以:鑑於deep paging的性能問題,所有應儘量減少使用。
4. query string基礎語法
4.1query string基礎語法
GET /book/_search?q=name:java
GET /book/_search?q=+name:java
GET /book/_search?q=-name:java
+和-的含義: + 表示必須包含 - 表示 不包含
4.2、_all metadata的原理和作用
GET /book/_search?q=java
直接可以搜索所有的field,任意一個field包含指定的關鍵字就可以搜索出來。我們在進行中搜索的時候,難道是對document中的每一個field都進行一次搜索嗎?不是的。
es中all元數據。建立索引的時候,插入一條document,es會將所有的field值經行全量分詞,把這些分詞,放到all field中。在搜索的時候,沒有指定field,就在_all搜索。
舉例
{ name:jack email:[email protected] address:beijing }
_all : jack,[email protected],beijing