搜索方案,如何實現?採用什麼技術和策略?php
全文搜索就是對文本數據的一種索引(分詞索引,並不是數據庫索引)搜索方式。java
全文搜索特色,
1.作相關度排序
2.對文本中的關鍵字作高亮顯示
3.基於單詞進行搜索
4.只關注文本,不考慮語義算法
使用場景,替換模糊查詢。
模糊查詢缺點:查詢速度慢,沒有相關度排序,沒有文本高亮顯示,沒有摘要截取,搜索效果很差。數據庫
下降數據庫壓力,提升查詢速度。json
全文搜索的核心
1.建立索引(創建關鍵字與文本之間的關聯關係。經過單詞查詢到句子對應的編號。)
分詞-->語法處理-->去重-->排序
2.搜索索引
輸入關鍵字-->關鍵字分詞-->搜索獲得具體編號-->經過編號獲取句子-->封裝對象展現到前臺數組
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,屬性,規格,分類等),或店鋪信息。
先思想,後實踐,再解釋。從瞭解,到入門,到精通。
用的最多的是容錯查詢!模糊查詢!
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
建立文檔索引
獲取文檔
更新文檔