開源軟體

基於 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 ,否則必究相關責任!

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:開源軟體

    開源軟體

    在 Linux 終端中管理您的密碼

    在信息時代,我們的所使用的密碼只會越來越多,你是否遇到過密碼太多而經常遺忘?所以應該如何高效地管理這些密碼?本篇文章主要講述了在我們擁有大量的密碼時,在Linux終端下,使用 Pass 管理系統高效地管理密碼,並為我們提供了詳細的操作步驟,使我們更加快速熟悉地掌握如何使用 Pass,減少我們自己在以後的使用中的可能遇到的煩惱。
    開源軟體

    用 Scribus 來進行排版吧!

    想不想製作一些親手設計的小冊子呢?來使用專業級的開源軟體 Scribus 快捷排版吧!這款應用可以讓你輕鬆地把創意落地成可列印的文檔,無論在家、辦公室還是專業的印刷廠都可以使用。在過程中也不會用到任何剪刀、膠水,完美契合不善動手的人。
    開源軟體

    使用 pdftk-java 來編輯 PDF 吧!

    在用命令行處理大量 PDF 文件時,手動操作通常不是一個好的選擇。這時候可以選擇使用 pdftk-java 工具,配合上對應批量操作的 Makefile 文件,能讓你事半功倍。
    開源軟體

    來點更高雅的!用 Linux Sampler 演奏數字管弦樂

    一直以來,音樂合成器都在嘗試模擬真實的樂器。然而在技術的發展中,合成音樂家們發現如果想真正地捕獲到樂器的美感,只能去錄製他們的聲音,再通過技術合成手段來獲得想要的音樂。如果你想要為自己的遊戲或者其他應用來配上一段優美的音樂,聘請管弦樂隊顯然是非常昂貴的。但通過 Linux Sampler 這個開源程序,或者再加上一個 MIDI 鍵盤,也是可以實現一段成功的演奏的。