0x00.搜索引擎基礎和ES

文檔

文檔是搜索引擎的數據源,所有的檢索等操作都是面向文檔的,是搜索引擎的基礎。

文檔包含一個或多個字段,每個字段被賦予具體的字段類型:字符串、標記化文本、布爾值、日期、時間、經緯度等等。文檔就是包含一系列字段的集合。是數據的抽象表示。但是在搜索引擎中,文檔是扁平且互相獨立的數據。

在大多數應用中,多數實體或對象可以被序列化為包含鍵值對的 JSON 對象。 一個 鍵 可以是一個字段或字段的名稱,一個 值 可以是一個字符串,一個數字,一個布爾值, 另一個對象,一些數組值,或一些其它特殊類型諸如表示日期的字符串,或代表一個地理位置的對象。
通常情況下,我們使用的術語對象和文檔是可以互相替換的。不過,有一個區別: 一個對象僅僅是類似于 hash 、 hashmap 、字典或者關聯數組的 JSON 對象,對象中也可以嵌套其他的對象。 對象可能包含了另外一些對象。在 Elasticsearch 中,術語文檔有著特定的含義。它是指最頂層或者根對象, 這個根對象被序列化成 JSON 并存儲到 Elasticsearch 中,指定了唯一 ID。

潛在的字段類型的數量是無限的,因為一個字段類型是由若干分析步驟組成的,這些步驟會決定數據如何在字段中被處理,以及如何映射到搜索引擎中。每個字段在搜索引擎的schema(ES中是mapping)被定義為特定的字段類型,文檔通過定義schema,映射為特定字段類型的字段集合,文檔的每個字段根據其字段類型進行內容分析,分析的結果保存在索引中,這樣在發起查詢時能檢索到相關信息。

文檔元數據

一個文檔不僅僅包含它的數據 ,也包含 元數據 —— 有關 文檔的信息。 三個必須的元數據元素如下:

  • _index 文檔在哪存放
  • _type 文檔表示的對象類別
  • _id 文檔唯一標識

索引

通過使用 index API ,文檔可以被 索引 —— 存儲和使文檔可被搜索 。 但是首先,我們要確定文檔的位置。一個文檔的元數據 _index 、 _type 和_id 唯一標識一個文檔。 我們可以提供自定義的 _id 值,或者讓 index API 自動生成。
存儲數據到 Elasticsearch 的行為叫做 索引 ,但在索引一個文檔之前,需要確定將文檔存儲在哪里。

  • 索引(名詞):

一個 索引 類似于傳統關系數據庫中的一個 數據庫 ,是一個存儲關系型文檔的地方。 索引 (index) 的復數詞為 indices 或 indexes 。

  • 索引(動詞):

索引一個文檔 就是存儲一個文檔到一個 索引 (名詞)中以便它可以被檢索和查詢到。這非常類似于 SQL 語句中的 INSERT 關鍵詞,除了文檔已存在時新文檔會替換就文檔情況之外。

  • 倒排索引:

關系型數據庫通過增加一個 索引 比如一個 B樹(B-tree)索引 到指定的列上,以便提升數據檢索速度。Elasticsearch 和 Lucene 使用了一個叫做 倒排索引(反向索引) 的結構來達到相同的目的。
非結構化數據中所存儲的信息是每個文件包含哪些字符串,也即已知文件,欲求字符串相對容易,也即是從文件到字符串的映射。而我們想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即從字符串到文件的映射。兩者恰恰相反。于是如果索引總能夠保存從字符串到文件的映射,則會大大提高搜索速度。
由于從字符串到文件的映射是文件到字符串映射的反向過程,于是保存這種信息的索引稱為反向索引。

默認的,一個文檔中的每一個屬性都是 被索引 的(有一個倒排索引)和可搜索的。一個沒有倒排索引的屬性是不能被搜索到的。

索引創建過程

  1. 有一系列被索引的文件。
  2. 被索引文件經過語法分析和語言處理形成一系列的詞(term)。
  3. 經過索引創建形成詞典和反向索引表。
  4. 通過索引存儲將索引寫入磁盤。
分析與分析器

分析 包含下面的過程:

  1. 首先,將一塊文本分成適合于倒排索引的獨立的 詞條 ,
  2. 之后,將這些詞條統一化為標準格式以提高它們的“可搜索性”,或者 recall

分析器執行上面的工作。 分析器 實際上是將三個功能封裝到了一個包里:

  • 字符過濾器:
    首先,字符串按順序通過每個 字符過濾器 。他們的任務是在分詞前整理字符串。一個字符過濾器可以用來去掉HTML,或者將 & 轉化成 and
  • 分詞器:
    其次,字符串被 分詞器 分為單個的詞條。一個簡單的分詞器遇到空格和標點的時候,可能會將文本拆分成詞條。
  • Token 過濾器:
    最后,詞條按順序通過每個 token 過濾器 。這個過程可能會改變詞條(例如,小寫化 Quick ),刪除詞條(例如, 像 aandthe 等無用詞),或者增加詞條(例如,像 jump 和 leap 這種同義詞)。

Elasticsearch提供了開箱即用的字符過濾器、分詞器和token 過濾器。

索引分片和路由

在ES中,索引只是一個邏輯上的存儲單元,實際的存儲單元是shard,即分片。一個索引包含多個分片(分片數量在創建索引是確定,且后期不可改變),分片擁有多個副本,副本和主分片的數據是同步的,在分布式的部署中,分片會分散在多個節點中,一方面保護數據,另一方面可以并行檢索分片。

路由即文檔到分片的映射邏輯,通過路由找到文檔存儲的分片。默認使用文檔的id進行路由,可以自定義為其他字段。

結構化數據和非結構化數據

  • 結構化數據:指具有固定格式或有限長度的數據,如數據庫,元數據等。
  • 非結構化數據:指不定長或無固定格式的數據,如郵件,word文檔等。 非結構化數據又一種叫法叫全文數據。
  • 有的地方還會提到第三種,半結構化數據,如XML,HTML等,當根據需要可按結構化數據來處理,也可抽取出純文本按非結構化數據來處理。

按照數據的分類,搜索也分為兩種:

  1. 對結構化數據的搜索:如對數據庫的搜索,用SQL語句。再如對元數據的搜索,如利用windows搜索對文件名,類型,修改時間進行搜索等。
  2. 對非結構化數據的搜索:如利用windows的搜索也可以搜索文件內容,Linux下的grep命令,再如用Google和百度可以搜索大量內容數據。

對非結構化數據也即對全文數據的搜索主要有兩種方法:

  1. 順序掃描法(Serial Scanning)
  2. 全文檢索(Full-text Search)

全文檢索

全文檢索大體分兩個過程,索引創建(Indexing)和搜索索引(Search):

  1. 索引創建:將現實世界中所有的結構化和非結構化數據提取信息,創建索引的過程。
  2. 搜索索引:就是得到用戶的查詢請求,搜索創建的索引,然后返回結果的過程。

映射

為了能夠將時間域視為時間,數字域視為數字,字符串域視為全文或精確值字符串, Elasticsearch 需要知道每個域中數據的類型。這個信息包含在映射中。

數據類型

  • Core datatypes
類別 數據類型
string text (可全文檢索,不可精確匹配),keyword(精確匹配)
Numeric datatypes long, integer, short, byte, double, float, half_float, scaled_float
Date datatype date
Boolean datatype boolean
Binary datatype binary
Range datatypes integer_range, float_range, long_range, double_range, date_range
  • Complex datatypes
類別 數據類型
Array datatype Array support does not require a dedicated type
Object datatype object for single JSON objects
Nested datatype nested for arrays of JSON objects
  • Geo datatypes
類別 數據類型
Geo-point datatype geo_point for lat/lon points
Geo-Shape datatype geo_shape for complex shapes like polygons
  • Specialised datatypes
類別 數據類型
IP datatype ip for IPv4 and IPv6 addresses
Completion datatype completion to provide auto-complete suggestions
Token count datatype token_count to count the number of tokens in a string
mapper-murmur3 murmur3 to compute hashes of values at index-time and store them in the index
Percolator type Accepts queries from the query-dsl
join datatype Defines parent/child relation for documents within the same index

參考資料

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容