Elasticsearch全文搜尋引擎淺析
簡介:
Elastic 的底層是開源庫Luence。但是,你沒法直接用 Lucene,必須自己寫程式碼去呼叫它的介面。Elastic 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用。Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。搜尋引擎在對資料構建索引時,需要進行分詞處理。分詞是指將一句話拆解成多個單字或詞,這些字或詞便是這句話的關鍵詞。如
設定遠端訪問:
預設情況下,Elastic 只允許本機訪問,如果需要遠端訪問,可以修改 Elastic 安裝目錄的config/elasticsearch.yml
network.host
的註釋,將它的值改成0.0.0.0
,然後重新啟動 Elastic。線上服務不要這樣設定,要設成具體的 IP。
安裝中文分詞外掛:
Elasticsearch 不支援對中文進行分詞建立索引,需要配合擴充套件elasticsearch-analysis-ik來實現中文分詞處理。,也可以考慮其他外掛(比如 smartcn)。
基本概念:
1.Node 與 Cluster:
單個 Elastic 例項稱為一個節點(node)。一組節點構成一個叢集(cluster)。
2.Index:
curl -X GET 'http://localhost:9200/_cat/indices?v' #當前節點的所有 Index
Elastic 會索引所有欄位,經過處理後寫入一個反向索引(Inverted Index)。查詢資料的時候,直接查詢該索引。
所以,Elastic 資料管理的頂層單位就叫做 Index(索引)。它是單個數據庫的同義詞。每個 Index (即資料庫)的名字必須是小寫。
3.Document:
Index 裡面單條的記錄稱為 Document(文件)。許多條 Document 構成了一個 Index。
4.Type:
$ curl 'localhost:9200/_mapping?pretty=true' #列出每個 Index 所包含的 Type。
Document 可以分組,比如weather這個 Index 裡面,可以按城市分組(北京和上海),也可以按氣候分組(晴天和雨天)。這種分組就叫做 Type,它是虛擬的邏輯分組,用來過濾 Document。不同的 Type 應該有相似的結構(schema),舉例來說,id
products
和logs
)應該存成兩個 Index,而不是一個 Index 裡面的兩個 Type(雖然可以做到)。
注意:根據規劃,Elastic 6.x 版只允許每個 Index 包含一個 Type,7.x 版將會徹底移除 Type。
資料的操作:
1.新增資料:
向指定的 /Index/Type 傳送 PUT 請求,就可以在 Index 裡面新增一條記錄。比如,向/accounts/perople/傳送請求,就可以新增一條人員記錄。
$ curl -X PUT 'localhost:9200/accounts/perople/1' -d '
{
"user": "李四",
"title": "建築師",
"desc": "資料庫管理"
}'
2.刪除資料:
刪除記錄就是發出 DELETE 請求。
$ curl -X DELETE 'localhost:9200/accounts/people/1'
3.更新資料:
更新記錄就是使用 PUT 請求,重新發送一次資料。
$ curl -X PUT 'localhost:9200/accounts/people/1' -d '
{
"user" : "李四",
"title" : "建築師",
"desc" : "資料庫管理,軟體開發"
}'
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{"total":2,"successful":1,"failed":0},
"created":false
}
4.查詢資料:
使用 GET 方法,直接請求/accounts/people/search,就會返回所有記錄。
$ curl 'localhost:9200/accounts/people/search'
{
"took":2,
"timed_out":false,
"_shards":{"total":5,"successful":5,"failed":0},
"hits":{
"total":2,
"max_score":1.0,
"hits":[
{
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_score":1.0,
"_source": {
"user": "李四",
"title": "工程師",
"desc": "系統管理"
}
},
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_score":1.0,
"_source": {
"user" : "張三",
"title" : "工程師",
"desc" : "資料庫管理,軟體開發"
}
}
]
}
}
5.全文搜尋:
Elastic 的查詢非常特別,使用自己的查詢語法,要求 GET 請求帶有資料體。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配條件" }}
}'
Elastic 預設一次返回10條結果,可以通過size
欄位改變這個設定。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配條件" }},
"size": 1
}'
還可以通過from
欄位,指定位移。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配條件" }},
"from": 1,
"size": 1
}'
上面程式碼指定,從位置1開始(預設是從位置0開始),只返回一條結果。
6.邏輯運算:
如果有多個搜尋關鍵字, Elastic 認為它們是or關係。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配條件一 匹配條件二" }}
}'
上面程式碼搜尋的是 匹配條件一 or 匹配條件二。
如果要執行多個關鍵詞的and搜尋,必須使用布林查詢。
$ curl 'localhost:9200/accounts/people/search' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "desc": "匹配條件一" } },
{ "match": { "desc": "匹配條件二" } }
]
}
}
}'