全文檢索細說

搜索方案,如何實現?採用什麼技術和策略?php

全文檢索思想

全文搜索就是對文本數據的一種索引(分詞索引,並不是數據庫索引)搜索方式。java

全文搜索特色,
1.作相關度排序
2.對文本中的關鍵字作高亮顯示
3.基於單詞進行搜索
4.只關注文本,不考慮語義算法

使用場景,替換模糊查詢。
模糊查詢缺點:查詢速度慢,沒有相關度排序,沒有文本高亮顯示,沒有摘要截取,搜索效果很差。數據庫

下降數據庫壓力,提升查詢速度。json

全文搜索的核心
1.建立索引(創建關鍵字與文本之間的關聯關係。經過單詞查詢到句子對應的編號。)
分詞-->語法處理-->去重-->排序
2.搜索索引
輸入關鍵字-->關鍵字分詞-->搜索獲得具體編號-->經過編號獲取句子-->封裝對象展現到前臺數組

全文檢索的一種實現?Lucene

Lucene是全文檢索的一種實現,一堆jar包。服務器

中小應用:Lucene(也能使用ES)
大型應用:Elastic Search,Sorl架構

核心API
索引庫中
增刪改:IndexWriter
查:IndexSearcher測試

使用過程,下載,導入jar包,測試使用。插件

看視頻,看思想!

Overview查看分詞狀況,Documents查看Doc記錄,Search進行查詢。

索引目錄(Directory)就是存儲索引文件目錄的對象,裏面存放索引文件。

底層的東西,是科學家研究的。有些算法,不是常人能看懂的。

分詞,包括中文分詞,英文分詞,中英文結合分詞。
一堆Api接口中,咱們只須要本身須要的。
有些老外寫的玩意兒,不必定很友好。

分詞的時候,去除中止詞,增長一些擴展詞。
能夠控制力度。分詞的大小。

Document是一個動態列。一個Document對象能夠隨意的添加不少列。

須要存,須要分詞,須要索引,須要查詢的(標題,摘要,產品名稱)

須要存,但不須要索引,不須要查詢的(路徑)

須要存,不須要分詞,須要查詢的(ID,人名,地名)

不須要存,須要分詞,須要索引,須要查詢(文章,大字段)

是否存儲,是否索引,是否分詞。(ik分詞器)

Document隨着數據庫的改變而改變。一個Document對應一個文章或者商品信息(id,title,desc,屬性,規格,分類等),或店鋪信息。

先思想,後實踐,再解釋。從瞭解,到入門,到精通。

用的最多的是容錯查詢!模糊查詢!

ES(Elastic Search)全文檢索服務器

Lucene只能用Java,使用負雜。不支持集羣環境(索引數據不一樣步)。
這個時候ES就誕生了。
大型項目都是須要集羣的。

ES,實時文件存儲。
能夠擴展到上百臺服務器,處理PB級結構化或非結構化數據。
高度集成化的服務,能夠經過RESTfulAPI,各類語言的客戶端,甚至命令行與之交互。

ES封裝了Lucene,使用變得更簡單。

ES,都是http請求。Lucene都是調用API執行操做。

ES使用案例(GitHub)

重量級對手,Solr。

服務端,客戶端。RESTful。(圖解,剖析架構),使用json做爲數據交換格式。

如何使用?

1.安裝ES服務端
2.瞭解Restful風格
3.選擇圖形界面客服端
4.使用圖形客戶端向服務器發送各類命令
5.使用java,php客戶端語言操做ES服務器,增刪改查

依賴JDK1.7+

圖形界面訪問9200端口,代碼端訪問9300端口。

DSL查詢與過濾

由ES提供的豐富靈活的查詢語言。

DSL查詢,DSL過濾。

DSL過濾是精確查詢。

DSL查詢是模糊查詢。

經過JSON來處理複雜的查詢條件。

理解知識體系,之後使用的時候,查詢手冊就能夠了。

分詞器,須要經過插件進行集成。在服務器端進行集成。(IK分詞器)

文檔映射機制用於進行字段類型確認(字段是什麼類型,哪一個分詞器),將每一個字段匹配爲一種肯定的數據類型。

字符串,數字,日期,邏輯。

對象類型,數組類型,地理位置。

若是不指定類型,它會有本身默認的類型。

自定義映射包括設置:
1.類型
2.是否可索引,可過濾
3.權重
4.格式
5.長度,大於該值的字符串將不會被索引和存儲
6.是否將該值加到_all中
7.是否存儲
8.索引方式,索引並分詞,索引不分詞,不索引
9.索引分詞器,索引建立時使用的分詞器,ik_smart,ik_max_word,standard
10.搜索分詞器,搜索該字段的值時,傳入的查詢內容的分詞器

自定義高於全局,全局高於默認。

最佳實踐

1.配置全局動態模板映射
2.建立索引庫
3.配置字段映射
4.建立、更新、刪除文檔
5.搜索

鏈接ES

建立文檔索引

獲取文檔

更新文檔

相關文章
相關標籤/搜索