ElasticSearch全文搜索進階
點擊上方“IT那活兒”,關注后了解更多內容,不管IT什么活兒,干就完了!!!
索引(index) -- Elasticsearch通過索引的方式對邏輯數據進行邏輯存儲。索引類似于關系型數據庫中的表,索引的結構是為了進行快速有效的全文索引,索引不保存原始值。可將索引多帶帶放在一臺主機或分散在多個主機上,每個索引至少有一個或多個分片,每個分片可以有多個副本。
文檔?????????????????? -- 文檔是存儲在Elasticsearch中的主要實體,一個文檔就是索引所對應的一條記錄。Elasticsearch的文檔有不同的結構,但相同的字段必須是相同類型。文檔可以有多個字段,每個字段可能在一個文檔中多次出現,這類字段稱為多值字段。字段的類型可以是數值、文本或日期,復雜類型的字段可以包含其他文檔或數組。映射 -- 文檔寫進索引前需要進行分析,即寫入的文本如何分割為詞條、詞條是否又會被過濾,這樣的分析行為就是映射,映射規則一般由用戶自定義。 非結構化索引即不需要創建索引結構既可寫入數據到索引中,但實際上在Elasticsearch底層會進行結構化操作,如下示例創建空索引。 更新文檔時的數據其實是不會被修改的,而是通過覆蓋的形式進行更新,即更新文檔的版本號,版本號+1。如下查看結果數據已更新: 同樣也可以局部更新數據,即更新文檔中的指定字段。更新時,先查詢這個文檔的數據,然后進行覆蓋操作。步驟為:先從舊文檔中檢索、修改、刪除舊文檔、索引新文檔。如下,通過_update標識局部更新數據: 通過DELETE可以刪除文檔數據,文檔刪除后并不會立即從磁盤移除,而是將狀態標記為已刪除,Elasticsearch會在滿足特定條件后自動進行已刪除內容的清理。如下返回信息中result:deleted即已刪除,同時_version也+1了。 DSL(Domain Specific Language)是Elasticsearch提供的查詢語言,支持復雜、強大的查詢,DSL以JSON請求體的形式進行查詢。 全文搜索,查詢firstname為Blake或Vera的員工。 Elasticsearch也支持聚合操作,類似SQL中的group by操作。如下對age字段進行聚合操作,31歲的員工有61位,39歲的員工有60位。
1. routing -- 當文檔在集群中保存時,文檔應該存儲在哪個節點呢?隨機還是輪詢?Elasticsearch采用如下計算方式來確定文檔應該存儲到的節點位置。計算公式:Shard = hash(routing) % number_of_primary_shardsRouting值可以是任意字符串,默認是_id,也可以自定義。Routing字符串通過hash函數生成一個數字,然后除以主分片的數量得到一個余數,余數的范圍是0到number_of_primary_shards-1,這個數字就是文檔所存儲的節點位置。2. 寫操作 -- 索引的新建、刪除都是寫操作,必須在主分片上成功執行才可復制到副分片上。下圖展示了在主副分片上新建索引和刪除文檔的必要步驟:1)客戶端向NODE1節點發送新建索引或刪除文檔的請求。2)NODE1節點使用文檔的_id確定文檔屬于分片0,分片0存放在NODE3節點,于是將請求轉發到NODE3節點上。NODE3在主分片上執行請求,執行成功后就轉發請求到NODE1和NODE2的副節點上。當所有的副節點執行成功,NODE3返回執行成功到請求節點,請求節點在返回給客戶端。客戶端收到執行成功后,文檔的修改已應用于所有的主分片,即修改生效。3. 搜索單個文檔 -- 文檔可以從主副分片中檢索,讀請求時,為了負載的均衡,請求節點會將請求發送到不同的分片,即循環遍歷所有的分片副本。當一個文檔已在主分片上保存,但同步到副分片還未完成,此時搜索該文檔時,副分片返回文檔未找到,主分片成功返回文檔。 2)NODE1節點通過_id確定文檔屬于分片0,分片0在三個節點上都存在,將請求轉發到NODE2節點。 3)NODE2節點返回文檔給NODE1節點,NODE1節點返回文檔給客戶端。4. 全文搜索 -- 文檔通常分散在各個節點上,如何在分布式的情況下進行全文搜索。通常分為兩個階段:搜索和取回。
4.1 搜索過程:
1)客戶端發送搜索請求到NODE3,NODE3創建長度為from+size的空優先級隊列。
2)轉發搜索請求到索引中每個主副分片,每個分片在本地執行查詢,并將查詢結果放到from+size的有序本地優先級隊列中。
3)每個分片向NODE3節點返回文檔的id和優先級隊列中所有文檔的排序值,NODE3把這些排序值合并到自己的優先級隊列中并產生全局的排序結果。
4.2 取回過程:
1)協調節點識別出需要取回的文檔,并且向相關分片發出get請求。
2)每個分片加載文檔并返回給協調節點。
3)直到所有的文檔都被取回,協調節點將結果返回給客戶端。
1. 元數據 -- 文檔中不僅有數據,還有關于文檔信息的元數據,元數據包括三個節點信息,分別是 _index、_type、_id。_index:即文檔存儲的位置。
實際上,數據是存儲和索引在分片上,索引是把分片組織在一起的邏輯空間。
_type:即文檔類型。
可以使用對象來表示一些事物,每個對象都屬于一個類,類定義了屬性或與對象關聯的數據。Elasticsearch使用相同類型的文檔表示相同的事物,因為其數據結構是相同的。
每個類型都有自己的映射或結果定義,所有類型下的文檔被存儲在同一個索引下。
_id:即文檔唯一標識。
_id僅僅是一個字符串,與_index、_type組合時,就可以在elasticsearch中唯一標識一個文檔。創建文檔時,可以自定義_id,也可以有Elasticsearch自動生成一個32位長度的_id。
2.1 pretty -- 在查詢url中使用pretty參數,返回的json格式的內容更易查看。2.2 指定響應字段 -- 如果不需要全部的字段,可以指定返回的字段。3. 判斷文檔是否存在 -- 可以使用head命令。4.1 批量查詢,如果文檔存在,則found值為true,否則為false。 批量請求時需要占用較多的內存,請求量越大,其他請求可用的內存就越小。一般會存在一個最佳的bulk請求值,超過這個值,性能可能不會提升,反而會降低。Bulk請求的最佳值并非固定值,取決于硬件性能、文檔的大小和復雜度、索引和搜索的負載。當然,這個最佳值是可以被找到的。批量搜索文檔時,隨著文檔大小或數量的增長,性能隨之降低。一般建議在1000~5000個文檔之間,若文檔是在太大,可使用較小的批次。
創建索引和插入數據,Elasticsearch都會自動進行類型判斷,當然也可以指定字段的類型,否則自動判斷的類型和實際需求可能是不符的。JSON type | Field type |
---|
Boolean: true or false | boolean |
Whole number: 123 | long |
Floating point: 123.45 | double |
String, valid date: 2014-09-15??? | date |
String: foo bar
| string
|
5.2 Elasticsearch支持的類型如下:Task Details | Vital Task |
---|
Boolean | boolean |
Whole number
| byte , short , integer , long |
Floating point
| float , double |
Date
| date |
String
| string , text , keyword |
- String -- 最新版本不再支持string,使用text和keyword。
- text -- 全文搜索一個字段時,如Email內容、小說文本、產品描述,使用text類型。text類型的字段內容會被分析,在生成倒排索引以前,字符串會被分析器分成各個詞項。
- keyword -- 適用于結構化的字段,如Email地址、IP地址、狀態碼等。需要對字段進行過濾、排序、聚合時,只能通過精確值搜索到keyword類型的字段。
6.1 term查詢,用于精確匹配指定的值,如日期、數字、布爾值、字符串等。 6.2 terms查詢,允許字段指定多個匹配值,類似于SQL中的in條件。 6.3 range查詢,指定范圍查詢數據,gt:大于、gte:大于等于、lt:小于、lte:小于等于。6.4 exist查詢,查詢文檔中是否包含指定字段。6.5 match查詢,適用于全文本查詢或精確查詢。match查詢一個全文本的字段時,會在查詢前使用分析器對被查詢的字符進行分析。若使用match查詢一個指定的值,如數字、日期、字符串或布爾值,則將查詢出指定的值。
7. 分詞 -- 將文本轉化為一系列的單詞。如:太陽從東方升起-->太陽/從/東方/升起。可以指定分詞器進行分詞,也可以指定索引分詞。中文分詞與英文分詞是有區別的,在英文中空格可以作為分隔符,而中文沒有明顯的詞匯分界點。中文分詞器有IK、jieba、thulac,但常用的是IK分詞器。IK Aanlyzer是開源的,基于java開發的輕量級的中文分詞工具包。它采用了特有的“正向迭代最細粒度切分算法”,高速處理能力可達到每秒80萬字,采用多子處理器分析模式,支持數字(日期、數量詞、科學計數法)、字母(URL、Email)、中文詞匯(地名、姓名)的分詞處理。需要多帶帶安裝IK分詞器插件,插件下載后解壓到/elasticsearch/plugins/ik目錄,重啟elasticsearch即可。a. 新建索引student,增加字段name、age、address、hobby。8.3 邏輯”or”多詞搜索并高亮顯示,默認”or”搜索。8.5 通過mininum_should_match指定匹配度來搜索。8.6 組合搜索,must--必須包含,must_not--不能包含,should--如果包含。8.7 權重,在查詢時可以增加權重來影響結果數據的得分,權重越大排序越靠前。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/129636.html