elasticsearch 概念(1)工做原理和基本概念

這篇文章是摘自其餘人寫的,百度百科上的解釋好籠統,我只用過mysql這種關係型數據庫,抽象的概念理解起來很難,這篇文建的解釋仍是很形象的,因此摘取了部分。html

關於搜索引擎

各位知道,搜索程序通常由索引鏈及搜索組件組成。mysql

索引鏈功能的實現須要按照幾個獨立的步驟依次完成:檢索原始內容、根據原始內容來建立對應的文檔、對建立的文檔進行索引。sql

搜索組件用於接收用戶的查詢請求並返回相應結果,通常由用戶接口、構建可編程查詢語句的方法、查詢語句執行引擎及結果展現組件組成。數據庫

圖片描述

著名的開源程序Lucene是爲索引組件,它提供了搜索程序的核心索引和搜索模塊,例如圖中的「Index」及下面的部分;而ElasticSearch則更像一款搜索組件,它利用Lucene進行文檔索引,並向用戶提供搜索組件,例如「Index」上面的部分。兩者結合起來組成了一個完整的搜索引擎。編程

索引組件

索引是一種數據結構,它容許對存儲在其中的單詞進行快速隨機訪問。瀏覽器

當須要從大量文本中快速檢索文本目標時,必須首先將文本內容轉換成可以進行快速搜索的格式,以創建針對文本的索引數據結構,此即爲索引過程。服務器

它一般由邏輯上互不相關的幾個步驟組成網絡

  • 第一步:獲取內容。數據結構

過網絡爬蟲或蜘蛛程序等來蒐集及界定須要索引的內容。app

Lucene並不提供任何獲取內容的組件,所以,須要由其它應用程序負責完成這一功能,例如著名的開源爬蟲程序Solr、Nutch、Grub及Aperture等。

必要時,還能夠自行開發相關程序以高效獲取自有的特定環境中的數據。獲取到的內容須要創建爲小數據塊,即文檔(Document)。

  • 第二步:創建文檔。

獲取的原始內容須要轉換成專用部件(文檔)才能供搜索引擎使用。

通常來講,一個網頁、一個PDF文檔、一封郵件或一條日誌信息能夠做爲一個文檔。文檔由帶「值(Value)」的「域(Field)」組成,例如標題(Title)、正文(body)、摘要(abstract)、做者(Author)和連接(url)等。

不過,二進制格式的文檔處理起來要麻煩一些,例如PDF文件。

對於創建文檔的過程來講有一個常見操做:向單個的文檔和域中插入加權值,以便在搜索結果中對其進行排序。權值可在索引操做前靜態生成,也可在搜索期間才動態生成。權值決定了其搜索相關度。

  • 第三步:文檔分析。

搜索引擎不能直接對文本進行索引,確切地說,必須首先將文本分割成一系列被稱爲語彙單元(token)的獨立原子元素,此過程即爲文檔分析。

每一個token大體能與天然語言中的「單詞」對應起來,文檔分析就是用於肯定文檔中的文本域如何分割成token序列。

文檔分析中要解決的問題包括如何處理鏈接一體的各個單詞、是否須要語法修正(例如原始內容存在錯別字)、是否須要向原始token中插入同義詞(例如laptop和notebook)、是否須要將大寫字符統一轉換爲小寫字符,以及是否將單數和複數格式的單詞合併成同一個token等。

這一般須要詞幹分析器等來完成此類工做,Lucene提供了大量內嵌的分析器,也支持用戶自定義分析器,甚至聯合Lucene的token工具和過濾器建立自定義的分析鏈。

  • 第四步、文檔索引

在索引步驟中,文檔將被加入到索引列表。事實上,Lucene爲此僅提供了一個很是簡單的API,然後自行內生地完成了此步驟的全部功能。

搜索組件

索引處理就是從索引中查找單詞,從而找到包含該單詞的文檔的過程。搜索質量主要由查準率(Precision)和查全率(Recall)兩個指標進行衡量。

查準率用來衡量搜索系列過濾非相關文檔的能力,而查全率用來衡量搜索系統查找相關文檔的能力。

另外,除了快速搜索大量文本和搜索速度以後,搜索過程還涉及到了許多其它問題,例如單項查詢、多項查詢、短語查詢、通配符查詢、結果ranking和排序,以及友好的查詢輸入方式等。這些問題的解決,一般須要多個組件協做完成。

搜索組件主要由如下幾個部分組成:

  • 一、用戶搜索界面

UI(User Interface)是搜索引擎的重要組成部分,用戶經過搜索引擎界面進行搜索交互時,他們會提交一個搜索請求,該請求須要先轉換成合適的查詢對象格式,以便搜索引擎能執行查詢。

  • 二、創建查詢

用戶提交的搜索請求一般以HTML表單或Ajax請求的形式由瀏覽器提交到搜索引擎服務器,所以,須要事先由查詢解析器一類的組件將這個請求轉換成搜索引擎使用的查詢對象格式。

  • 三、搜索查詢

當查詢請求創建完成後,就須要查詢檢索索引並返回與查詢語句匹配的並根據請求排好序的文檔。

搜索查詢組件有着複雜的工做機制,它們一般根據搜索理論模型執行查詢操做。

常見的搜索理論模型有純布爾模型、向量空間模型及機率模型三種。Lucene採用了向量空間模型和純布爾模型。

  • 四、展示結果

查詢得到匹配查詢語句並排好序的文檔結果集後,須要用直觀、經濟的方式爲用戶展示結果。

UI也須要爲後續的搜索或操做提供清晰的嚮導,如完善搜索結果、尋找與匹配結果類似的文檔、進入下一頁面等。

本節的最後簡單說一下Lucene。

Lucene是一款高性能的、可擴展的信息檢索(IR)工具庫,是由Java語言開發的成熟、自由開源的搜索類庫,基於Apache協議受權。

Lucene只是一個軟件類庫,若是要發揮Lucene的功能,還須要開發一個調用Lucene類庫的應用程序。

文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,而域的值則是真正被搜索的內容。每一個域都有其標識名稱,一般爲一個文本值或二進制值。

將文檔加入索引中時,須要首先將數據轉換成Lucene能識別的文檔和域,域值是被搜索的對象。

例如,用戶輸入搜索內容「title:elasticsearch」時,則表示搜索「標題」域值中包含單詞「elasticsearch」的全部文檔。

默認狀況下,全部文檔都沒有加權值,或者說其加權因子都爲1.0。

經過改變文檔的加權因子,能夠指示Lucene在計算相關性時或多或少地考慮到該文檔針對索引中其它文檔的重要程度,從而可以將有着較大加權因子的文檔排列在較前的位置。

除了對文檔進行加權,Lucene還支持對域進行加權操做。

ElasticSearch(簡稱ES)是一個基於Lucene構建的開源、分佈式、RESTful的全文本搜索引擎。

不過,ElasticSearch卻也不只只是一個全文本搜索引擎,它仍是一個分佈式實時文檔存儲,其中每一個field均是被索引的數據且可被搜索;也是一個帶實時分析功能的分佈式搜索引擎,而且可以擴展至數以百計的服務器存儲及處理PB級的數據。

如前所述,ElasticSearch在底層利用Lucene完成其索引功能,所以其許多基本概念源於Lucene。

ES的基本概念。

  • 索引(Index)

ES將數據存儲於一個或多個索引中,索引是具備相似特性的文檔的集合。類比傳統的關係型數據庫領域來講,索引至關於SQL中的一個數據庫,或者一個數據存儲方案(schema)。

索引由其名稱(必須爲全小寫字符)進行標識,並經過引用此名稱完成文檔的建立、搜索、更新及刪除操做。一個ES集羣中能夠按需建立任意數目的索引。

  • 類型(Type)

類型是索引內部的邏輯分區(category/partition),然而其意義徹底取決於用戶需求。所以,一個索引內部可定義一個或多個類型(type)。通常來講,類型就是爲那些擁有相同的域的文檔作的預約義。

例如,在索引中,能夠定義一個用於存儲用戶數據的類型,一個存儲日誌數據的類型,以及一個存儲評論數據的類型。類比傳統的關係型數據庫領域來講,類型至關於「表」。

  • 文檔(Document)

文檔是Lucene索引和搜索的原子單位,它是包含了一個或多個域的容器,基於JSON格式進行表示。

文檔由一個或多個域組成,每一個域擁有一個名字及一個或多個值,有多個值的域一般稱爲「多值域」。每一個文檔能夠存儲不一樣的域集,但同一類型下的文檔至應該有某種程度上的類似之處。

  • 映射(Mapping)

ES中,全部的文檔在存儲以前都要首先進行分析。用戶可根據須要定義如何將文本分割成token、哪些token應該被過濾掉,以及哪些文本須要進行額外處理等等。

另外,ES還提供了額外功能,例如將域中的內容按需排序。事實上,ES也能自動根據其值肯定域的類型。

接下去再說說ES Cluster相關的一些概念。

  • 集羣(Cluster)

ES集羣是一個或多個節點的集合,它們共同存儲了整個數據集,並提供了聯合索引以及可跨全部節點的搜索能力。

多節點組成的集羣擁有冗餘能力,它能夠在一個或幾個節點出現故障時保證服務的總體可用性。

集羣靠其獨有的名稱進行標識,默認名稱爲「elasticsearch」。節點靠其集羣名稱來決定加入哪一個ES集羣,一個節點只能屬一個集羣。

若是不考慮冗餘能力等特性,僅有一個節點的ES集羣同樣能夠實現全部的存儲及搜索功能。

  • 節點(Node)

運行了單個實例的ES主機稱爲節點,它是集羣的一個成員,能夠存儲數據、參與集羣索引及搜索操做。

相似於集羣,節點靠其名稱進行標識,默認爲啓動時自動生成的隨機Marvel字符名稱。

用戶能夠按須要自定義任何但願使用的名稱,但出於管理的目的,此名稱應該儘量有較好的識別性。

節點經過爲其配置的ES集羣名稱肯定其所要加入的集羣。

  • 分片(Shard)和副本(Replica)

ES的「分片(shard)」機制可將一個索引內部的數據分佈地存儲於多個節點,它經過將一個索引切分爲多個底層物理的Lucene索引完成索引數據的分割存儲功能,這每個物理的Lucene索引稱爲一個分片(shard)。

每一個分片其內部都是一個全功能且獨立的索引,所以可由集羣中的任何主機存儲。建立索引時,用戶可指定其分片的數量,默認數量爲5個。

Shard有兩種類型:primary和replica,即主shard及副本shard。

Primary shard用於文檔存儲,每一個新的索引會自動建立5個Primary shard,固然此數量可在索引建立以前經過配置自行定義,不過,一旦建立完成,其Primary shard的數量將不可更改。

Replica shard是Primary Shard的副本,用於冗餘數據及提升搜索性能。

每一個Primary shard默認配置了一個Replica shard,但也能夠配置多個,且其數量可動態更改。ES會根據須要自動增長或減小這些Replica shard的數量。

ES集羣可由多個節點組成,各Shard分佈式地存儲於這些節點上。

ES可自動在節點間按須要移動shard,例如增長節點或節點故障時。簡而言之,分片實現了集羣的分佈式存儲,而副本實現了其分佈式處理及冗餘功能。

文章來源:http://www.itnose.net/detail/...

相關文章
相關標籤/搜索