基於 Elasticsearch 構建搜索引擎
什麼是 Elasticsearch ?
Elasticsearch 是一個實時搜索和分析引擎。它可以大規模的索引文檔,同時允許你能夠搜索到它們,並快速地對其進行分析。
Elasticsearch 能夠被 Hadoop 集成,在大數據存儲和大數據搜索與分析的方面實現協作。在這篇文章中,我將會簡要地介紹它的工作原理,然後我會根據最近的一個項目去深入研究一些例子。
Elasticsearch 怎麼工作?
Elasticsearch 的核心使用了 Lucene 引擎 。Lucene 是一個用於優化文檔存儲的 Java 引擎,它可以高效地搜索和檢索與搜索項相匹配的文本項。
為什麼需要 Elasticsearch 呢? Elasticsearch 為你提供了一個更低層次的 Lucene 引擎和更為簡潔的 API ,它更具可擴展性,同時支持插件和其他一系列技術的集成。
首先介紹三個關鍵概念:
- 索引( index ):一個索引就是一個擁有相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來 標識(必須全部是小寫字母的),並且當我們要對這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集群中,你能夠創建任意多個索引。
-
類型( type ):在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會為具有一組相同欄位的文檔定義一個類型。比如說,我們假設你運營一個博客平台 並且將你所有的數據存儲到一個索引中。在這個索引中,你可以為用戶數據定義一個類型,為博客數據定義另一個類型,當然,也可以為評論數據定義另一個類型。
-
分片( shard ):一個索引可以存儲超出單個結點硬體限制的大量數據。比如,一個具有 10 億文檔的索引佔據 1TB 的磁碟空間,而任一節點可能沒有這樣大的磁碟空間來存儲或者單個節點處理搜索請求,響應會太慢。為了解決這個問題, Elasticsearch 提供了將索引劃分成多片的能力,這些片叫做分片。當你創建一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的「索引」,這個「索引」 可以被放置到集群中的任何節點上。
快速開始
額……這些都知道,但你該如何去使用它? Elasticsearch 提供了一個非常簡潔的 REST API ,你可以將文檔寫到 Elasticsearch , Elasticsearch 會自動構建索引,最後你可以使用查詢語句將這些文檔召回。
$ curl -XPUT 'http://localhost:9200/blog/page/1' -d '{
"author" : "Lewis",
"post_date" : "2016-07-15T10:00:00",
"content" : "This is my blog post on elasticsearch..."
}'
上面這條命令就直接構建了第一個索引。那麼現在就讓我們來詳細看看各個欄位是什麼意思是。在主機和埠之後的 URL 中,我們有三個選項。blog 是索引的名稱,而 page 則是我們前面討論的類型( type ),數字 1 代表當前這份文檔的 id 。
以下是結果的返回值:
{
"_shards" : {
"total" : 5,
"failed" : 0,
"successful" : 5
},
"_index" : "blog",
"_type" : "page",
"_id" : "1",
"_version" : 1,
"created" : true
}
這不僅回復顯示了我們上面的執行結果,同時還顯示了分片以及副本的情況。
所以,我們的文件現在已經被存儲了,我們可以簡單地重複這個過程來處理儘可能多的博客文章。
那麼我們該如何查詢呢?有兩種查詢 方法。下面分別展示了兩種查詢方式。
簡單查詢
$ curl -XGET 'http://localhost:9200/blog/_search?q=author:lewis'
複雜查詢
curl -XGET 'http://localhost:9200/blog/page/_search' -d
'{
"query" : {
"term" : { "author" : "lewis" }
}
}'
Elasticsearch 將返回如下結果。
{
"_shards":{
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits":{
"total" : 1,
"hits" : [
{
"_index" : "blog",
"_type" : "page",
"_id" : "1",
"_source" : {
"user" : "Lewis",
"post_date" : "2016-07-15T10:00:00",
"content" : "This is my blog post on elasticsearch..."
}
}
]
}
}
還有有許多不同的參數和大量可以使用的搜索技術,這些都可以在官方文檔中被找到。
Hadoop 集成優勢
你有幾個文件,然後索引它們,再執行一些搜索。聽起來很棒,但在企業中,你不太可能使用這種方法;你更傾向於將 PB 級的數據存儲存儲在某個彈性存儲集群中。
Elasticsearch 通過構建 elasticsearch-hadoop 使得一切變得非常簡單。 通過映射 hadoop 分離的輸入數據, Spark 的分區到 ES 的分片上解決分散式數據模型問題,這樣做能夠減少了數據拷貝,提高了性能。 數據能夠位於同一台機器上,因為 ES-hadoop 可能會與 Hadoop 和 Spark 進行數據交互,這樣防止了不必要的數據通過網路進行傳輸。
希望本文對 ES( Elasticsearch )的初次嘗試者有用,本文向你展示了如何快速構建自己的搜索引擎!只需要你的一點點想像力和一個簡易的 Web 前端,你很快就能與谷歌進行競爭了。O(∩_∩)O哈哈~
本文由 LinuxStory 志願者 Sunling 翻譯,更多詳情請查看原文。
原文鏈接:http://www.lewisgavin.co.uk/Search-Engine-Elasticsearch/
轉載請註明來自 LinuxStory ,否則必究相關責任!