在搜索引擎中,索引建立完之後,只能算是完成了一部分,搜索引擎還涉及到分頁,排序,顯示等這一些問題,由於在elasticsearch中這些問題都涉及的比較好,實現起來比較簡單,這裏就一起介紹了。
1、分頁
在elasticsearch中有兩種分頁查詢的方法,一種叫做淺分頁,一種叫做深分頁。
淺分頁
下面這個就是淺查詢:
POST /_search
{
"size": 2,
"from": 10,
"query": {
"match_all": {}
}
}
其實單詞的意思已經很明確了,但還是解釋一下,size表示每一頁顯示2條數據,from表示從第10頁開始,也就是說顯示的信息是從20-22條數據。這裏的排序使用的是默認評分排序。(慚愧,這個評分機制沒有去研究)
這個實現的原理是將前22條數據都查詢出來,然後根據需要將20-22條數據取出,很顯然這種方式在查詢頁數很多的時候基本上就不能用了,如果查詢第50000-50002條數據,需要將前50002數據都取出來,不管從空間還是從時間上都會爆炸的。
不同的博客有不同的說法,有的人說這種查詢最多支持10000,也有說50000的,反正就是不能很大。
深分頁
POST /_search?scroll=1m
{
"size": 4
}
這個就是深查詢,採用scroll查詢,這個查詢結果會出現一個scroll_id,就是下面這個,scroll=1m表示這個scroll_id維持的時間是1分鐘,如果這1分鐘沒有繼續查詢,那麼這個id就會失效。
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAC_zFlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAwAhZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_QWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_1FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv9hZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_cWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_4FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv-RZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_oWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_7FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv_BZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_0WVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_-FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv_xZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAMAAWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAADABFlVSRk93LUQtUnJTNEVMZHFDNFZPRWc="
接下來,要查詢下一頁就按照下面這麼做就好了。
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoEAAAAAAAAC_zFlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAwAhZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_QWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_1FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv9hZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_cWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_4FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv-RZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_oWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_7FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv_BZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAL_0WVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAAC_-FlVSRk93LUQtUnJTNEVMZHFDNFZPRWcAAAAAAAAv_xZVUkZPdy1ELVJyUzRFTGRxQzRWT0VnAAAAAAAAMAAWVVJGT3ctRC1SclM0RUxkcUM0Vk9FZwAAAAAAADABFlVSRk93LUQtUnJTNEVMZHFDNFZPRWc="
}
這種東西就避免了上面的問題,這個id就相當於一個指針的作用,避免了一次性取出過多的數據,但是這種查詢方式也有弊端,那就是無法指定頁數查詢(準確說是我不知道怎麼指定頁數),只能按順序一頁一頁查詢。
稍微自己總結一下分頁:如果是實現類似百度這種的搜索引擎,可以使用第一種方式,因爲用戶不可能一下子查看那麼多信息,而且第一種方式更加靈活;如果是要將所有數據都全部獲取到,則可以使用第二種方式,取出所有數據,便和怎麼取沒多大關係,之後的操作可以將數據取出之後自己再另做操作。
2、排序
排序的可以按照下面的方式來:
POST test01/test02/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "good": { "order": "desc" }},
{ "num": { "order": "desc" }}
]
}
就是說先以“good”字段降序排序,如果字段“good”相同,則按照“num”字段降序排序。
這個感覺還是很好理解的。
3、選擇返回字段
在搜索的時候返回的字段裏面可能並不是所有的字段都是需要的,部分加入索引的字段可能只是輔助作用,若這個字段也全都返回,尤其當這個字段的數據量比較大的時候,就很浪費網絡資源了
在elasticsearch中通過_source來要求返回的字段是哪些,這裏就是隻要求返回:”contactperson”,”img”兩個字段。
POST /test01/alumniassociation/_search
{
"query": {
"match_all": {}
},
"_source": {
"includes": [
"contactperson",
"img"
]
}
}
這個也是很簡單的,一看就懂的那種。
4、指定創建索引的字段
添加進索引的時候有時候需要指定某些字段是不需要分詞或者根本就不用建立索引的(我個人感覺這些字段在很多時候是沒有用的,添加進所有浪費資源,或者我還沒有用到高級的功能吧),這個時候雖然可以在創建索引mapping是指定analyzer是no還是not-analyzer的,但是這樣需要寫很多個mapping,顯然是不存在的,而且在logstash中也沒有辦法動態指定需要被analyzer的字段。
在使用logstash同步mysql的時候,配置conf文件的時候需要寫入sql語句,類似“select * from test02”,這樣的,這樣是將所有的字段都添加入索引,如果寫成“select id,title,summary from Test02”,則這個時候重新創建索引,只是將指定的字段添加進索引,其他的字段是不會被添加進索引的。
5、kibana的安裝
下載地址:https://www.elastic.co/downloads/kibana
根據需要下載,如果是在linux下,就下載rpm或者linux版本的,我下載的是這個版本,就是linux版本的,直接在linux下解壓之後就可以使用了
tar -zxvf kibana-5.5.0-linux-x86_64.tar.gz
修改kibana.yml中的一些信息,便於外網可以訪問:
server.host "localhost"
改爲(注意空格)
server.host "0.0.0.0"
然後進入到並目錄下,啓動服務就可以了,ELK基本上都是拆箱即用的:
cd kibana-5.5.0-linux-x86_64/bin
./kibana
然後訪問公網IP:5601,kibana會自動去訪問9200,也就是elasticsearch的端口號(當然elasticsearch這個時候必須啓動着),然後就可以使用kibana了
http://106.14.112.215:5601
其中Kibana中的Dev Tools 就是Kibana5新添加進入的,和sense的界面完全相同。
界面長這個樣子
關閉kibana下面兩個命令都是找不到進程的
ps -ef|grep kibana
ps -ef|grep 5301
需要用這個命令行
fuser -n tcp 5601
然後kill進程就可以關閉kibana了。
到這裏爲止,基本上elasticsearch的基礎都看完了,接下來想去試試實現他的java api。