總結之全文檢索ElasticSearch(一)——解析與使用

簡介

1、elasticsearch是一個基於Lucene的高擴展的分佈式搜索服務器,支持開箱即用。
2、elasticsearch隱藏了Lucene的複雜性,對外提供Restful 接口來操作索引、搜索。
優點:
1.擴展性好,可部署上百臺服務器集羣,處理PB級數據。
2.近實時的去索引數據、搜索數據。

ElasticSearch vs Solr

(1)es基本是開箱即用,非常簡單。Solr安裝複雜
  (2)Solr 利用 Zookeeper 進行分佈式管理,而 Elasticsearch 自身帶有分佈式協調管理功能。
  (3)Solr 支持更多格式的數據,比如JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。
  (4)Solr 官方提供的功能更多,而 Elasticsearch 本身更注重於核心功能,高級功能多有第三方插件提供,例如圖形化界面需要kibana友好支撐
  (5)Solr 查詢快,但更新索引時慢(即插入刪除慢),用於電商等查詢多的應用;
  (6) ES建立索引快(即查詢慢),即實時性查詢快,用於facebook新浪等搜索。Solr 是傳統搜索應用的有力解決方案,但 Elasticsearch 更適用於新興的實時搜索應用。

結構

下圖是ElasticSearch的索引結構,下邊黑色部分是物理結構,上邊黃色部分是邏輯結構,邏輯結構也是爲了更好的 去描述ElasticSearch的工作原理及去使用物理結構中的索引文件。

在這裏插入圖片描述
1、將要搜索的文檔內容分詞,所有不重複的詞組成分詞列表。
2、將搜索的文檔終以Document方式存儲起來。 3、每個詞和docment都有關聯。

索引(Index):

邏輯概念,一個可檢索的文檔對象(documents)的集合。類似與DB中的database概念。同一個集羣中可建立多個索引。比如,生產環境常見的一種方法,對每個月產生的數據建索引,以保證單個索引的量級可控。

類型(Type):

索引的下一級概念,相當於數據庫中的table。同一個索引裏可以包含多個 Type。 數據瀏覽tab中,選中某個索引或者類型,都可以看它對應的類型或索引。
  注意:6.0之前的版本有type(類型)概念,type相當於關係數據庫的表,ES官方將在ES9.0版本中徹底刪除type

文檔(Document):

即搜索引擎中的文檔概念,也是ES中一個可以被檢索的基本單位,相當於數據庫中的row,一條記錄。

字段(Field):

相當於數據庫中的column。ES中,每個文檔,其實是以json形式存儲的。而一個文檔可以被視爲多個字段的集合。比如一篇文章,可能包括了主題、摘要、正文、作者、時間等信息,每個信息都是一個字段,最後被整合成一個json串,落地到磁盤。

映射(Mapping):

相當於數據庫中的schema,用來約束字段的類型,不過 Elasticsearch 的 mapping 可以不顯示地指定、自動根據文檔數據創建。

ES比傳統關係型數據庫,對一些概念上的理解:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

Elasticsearch和Head插件安裝

安裝鏈接:https://www.cnblogs.com/xiaojianfeng/p/9435507.html
head插件是ES的一個可視化管理插件,用來監視ES的狀態,並通過head客戶端和ES服務進行交互,比如創建映 射、創建索引等
Head使用和概念鏈接:
https://www.cnblogs.com/peterYong/p/11024684.html

使用

使用POSTMAN工具,選擇raw。

創建索引庫

put http://localhost:9200/索引庫名稱

 {
    "settings":{ 
      "index":{ 
            "number_of_shards":1,
            "number_of_replicas":0 
              }
         }
}

number_of_shards:設置分片的數量,在集羣中通常設置多個分片,表示一個索引庫將拆分成多片分別存儲不同 的結點,提高了ES的處理能力和高可用性,入門程序使用單機環境,這裏設置爲1。
number_of_replicas:設置副本的數量,設置副本是爲了提高ES的高可靠性,單機環境設置爲0.

創建映射

發送:post http://localhost:9200/索引庫名稱/類型名稱/_mapping 創建類型爲xc_course的映射,共包括三個字段:name、description、studymondel
由於ES6.0版本還沒有將type徹底刪除,所以暫時把type起一個沒有特殊意義的名字。 post 請求:http://localhost:9200/xc_course/doc/_mapping
表示:在xc_course索引庫下的doc類型下創建映射。doc是類型名,可以自定義,在ES6.0中要弱化類型的概念, 給它起一個沒有具體業務意義的名稱。

 {   "properties": { 
                "name": {
                       "type": "text"
                   }, 
                 "description": {
                   		"type": "text" 
                  }, 
              	 "studymodel": { 
                    	 "type": "keyword" 
             		 } 
	  			} 
  }

創建文檔

發送:put 或Post http://localhost:9200/xc_course/doc/id值 (如果不指定id值ES會自動生成ID)
http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000

{
  "name":"Bootstrap開發框架",
  "description":"Bootstrap是由Twitter推出的一個前臺頁面開發框架,在行業之中使用較爲廣泛。此開發框架包 含了大量的CSS、JS程序代碼,可以幫助開發者(尤其是不擅長頁面開發的程序人員)輕鬆的實現一個不受瀏覽器限制的 精美界面效果。",   
  "studymodel":"201001" 
}

搜索文檔

1、根據課程id查詢文檔
發送:get http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000
2、查詢所有記錄 發送 get http://localhost:9200/xc_course/doc/_search
3、查詢名稱中包括spring 關鍵字的的記錄 發送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap

4、查詢學習模式爲201001的記錄
發送 get http://localhost:9200/xc_course/doc/_search?q=studymodel:201001

 {     "took": 1,    
  "timed_out": false,     
  "_shards": {        
   "total": 1,        
    "successful": 1,        
     "skipped": 0,       
       "failed": 0    
        },     
        "hits": {        
         "total": 1,        
          "max_score": 0.2876821,         
          "hits": [            
           {                
           "_index": "xc_course",                
            "_type": "doc",                
             "_id": "4028e58161bcf7f40161bcf8b77c0000",                 ·			"_score": 0.2876821,
             "_source": {
             "name": "Bootstrap開發框架",
            "description": "Bootstrap是由Twitter推出的一個前臺頁面開發框架,在行業之中使用較 爲廣泛。此開發框架包含了大量的CSS、JS程序代碼,可以幫助開發者(尤其是不擅長頁面開發的程序人員)輕鬆的實現 一個不受瀏覽器限制的精美界面效果。", 
               "studymodel": "201001"                
              }            
         }         
    ]     
   }
}


took:本次操作花費的時間,單位爲毫秒。 timed_out:請求是否超時 _shards:說明本次操作共搜索了哪些分片
hits:搜索命中的記錄 hits.total : 符合條件的文檔總數 hits.hits :匹配度較高的前N個文檔
hits.max_score:文檔匹配得分,這裏爲高分 _score:每個文檔都有一個匹配度得分,按照降序排列。 _source:顯示了文檔的原始內容。

IK分詞器

現分詞的效果將 “測試” 這個詞拆分成兩個單字“測”和“試”,這是因爲當前索引庫使用的分詞器對中文就是單字分詞。

安裝IK分詞器

使用IK分詞器可以實現對中文分詞的效果。 下載IK分詞器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)
解壓,並將解壓的文件拷貝到ES安裝目錄的plugins下的ik目錄下
ik分詞器有兩種分詞模式:ik_max_word和ik_smart模式。
1、ik_max_word
會將文本做細粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分爲“中華人民共和國、中華人民、中華、 華人、人民共和國、人民、共和國、大會堂、大會、會堂等詞語。
2、ik_smart

會做粗粒度的拆分,比如會將“中華人民共和國人民大會堂”拆分爲中華人民共和國、人民大會堂。
測試兩種分詞模式:
發送:post localhost:9200/_analyze {“text”:“中華人民共和國人民大會堂”,“analyzer”:“ik_smart” }

自定義詞庫

如果要讓分詞器支持一些專有詞語,可以自定義詞庫。
iK分詞器自帶一個main.dic的文件,此文件爲詞庫文件。
在這裏插入圖片描述
在上邊的目錄中新建一個my.dic文件(注意文件格式爲utf-8(不要選擇utf-8 BOM))
可以在其中自定義詞彙:
比如定義:
配置文件中配置my.dic,
在這裏插入圖片描述

映射維護方式

1、查詢所有索引的映射: GET: http://localhost:9200/_mapping
2、創建映射 post 請求:http://localhost:9200/xc_course/doc/_mapping
3、更新映射
映射創建成功可以添加新字段,已有字段不允許更新。
4、刪除映射
通過刪除索引來刪除映射。

常見的映射leix

字符串包括text和keyword兩種類型:
1、text
1)analyzer 通過analyzer屬性指定分詞器。
下邊指定name的字段類型爲text,使用ik分詞器的ik_max_word分詞模式。

 "name": {                   
 "type": "text",                  
  "analyzer":"ik_max_word"    
  }

2)index
通過index屬性指定是否索引。
默認爲index=true,即要進行索引,只有進行索引纔可以從索引庫搜索到。 但是也有一些內容不需要索引,比如:商品圖片地址只被用來展示圖片,不進行搜索圖片,此時可以將index設置 爲false。

 "pic": {   
 "type": "text",                           
 "index":false           
  }

3)store
是否在source之外存儲,每個文檔索引後會在 ES中保存一份原始文檔,存放在"_source"中,一般情況下不需要設置 store爲true,因爲在_source中已經有一份原始文檔了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章