1. 程式人生 > >PHP站內搜尋功能(laravel自帶Scout驅動+elasticsearch)

PHP站內搜尋功能(laravel自帶Scout驅動+elasticsearch)

站內搜尋

由於最近做的網站需要用到網站的站內搜尋,我也是偷偷摸摸學了一手,希望有需要的朋友也可以看看 搜尋引擎 Elasticsearch 官方網站 https://www.elastic.co/cn/ 原理:輸入內容與記憶體中的想匹配找到對應的文件輸出 Elasticsearch的中文支援主要依靠medcl Elasticsearch 基本概念 索引 伺服器地址 埠 index: 索引名稱 type: 索引型別名稱 document:索引文件 field 欄位 template: 模板

瞭解了這些基本之後

1.Elasticsearch安裝和IK外掛

Elasticsearch 安裝整合包

https://github.com/medcl/elasticsearch-rtf 1.下載zip檔案 2.解壓安裝bin下的elasticsearch.bat 這裡坑很多小編也是被折騰了一個晚上,最後重新下載了elasticsearch

首先要安裝JDK1.8並配置好java環境

其次是安裝 進入elasticsearch的bin 目錄下 elasticsearch.bat 安裝
安裝好以後啟動elasticsearch binelasticsearch -d

接著開啟http://localhost:9200/ 如果出現這個 那麼恭喜你已經安裝成功了 如果電腦記憶體小的只保留plugin目錄下的IK外掛

2.Elasticsearch的laravel scout寶安裝

https://laravel.com/docs/5.6/scout 在安裝laravel框架下composer require laravel/scout 配置app 檔案 LaravelScoutScoutServiceProvider::class 安裝外掛 composer require tamayo/laravel-scout-elastic 安裝完成以後app.php新增ScoutEnginesElasticsearchElasticsearchProvider::class 修改配置檔案scout 選擇elasticsearch搜尋引擎 增加索引驅動

根據自己的索引和埠進行配置index和hosts

3.建立ylaravel的索引和模板

建立command php artisan make:command ESInit 配置ESInit 修改命令啟動指令碼以及描述 在appConsoleKernel.php中掛載 接下來在php artisan 中就會發現有es的指令碼啟動命令那就說明建立成功了 引入guzzlehtpp composer require guzzlehttp/guzzle 在向handle 中建立template

$client = new Client(); $url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp'; $client->delete($url); $param = [ 'json'=>[ 'template' =>config('scout.elasticsearch.index'), 'mappings' =>[ '_default' =>[ 'dynamic_templates'=>[ [ 'string'=>[ 'match_mapping_type' =>'string', 'mapping' => [ 'type'=>'text', 'analyzer' => 'ik_smart', 'fields'=>[ 'keyword'=>[ 'type' =>'keyword' ] ] ] ] ] ] ] ] ], ]; $client->put($url,$param); $this->info("=======建立模板成功============="); //建立index $url =config('scout.elasticsearch.hosts')[0].'/'.config('scout.elasticsearch.index'); //$client->delete($url); $param = [ 'json'=>[ 'settings'=>[ 'refresh_interval' =>'5s', 'number_of_shards' =>1, 'number_of_replicas' =>0, ], 'mappings'=>[ '_default_' =>[ '_all' =>[ 'enabled'=>false ] ] ] ] ]; $client->put($url,$param); $this->info("=======建立索引成功=============");

4.匯入資料庫

修改模型 首先 引入laravel的scout並定義索引型別和欄位 下面是模型下的相關操作根據自己的需要修改

$this->work_name, 'work_content'=>$this->work_content, ]; }}

接下來就是將所要搜尋資料庫的表匯入 可以看到我已經成功引入了我的資料最大的ID是20 讓我們檢測一下work 20 隨後博主也是測試了資料庫的更新 我們可以看到資料庫更新了以後 laravel自動把資料加到了索引之中 也是醉了為什麼資料庫都更新了就更新不了這裡博主也是碰到了一個坑,花了一大晚上 之前博主寫的東西是用insert()方法插入到資料中的 而Scout驅動自動將資料更新到索引中必須要使用新建模型的方法 看到這裡我才恍然大悟,接著我便在我的控制器中重新寫了方法 建立好例項,接著寫入儲存的方法即可 測試了下我資料是否實時更新,發現刪除新增資料Scout都將我的資料自動更新到索引 接下來我們就可以寫搜尋的方法了

5.搜尋頁面編寫邏輯

首先我們要建立一個route來獲取搜尋的頁面 接下來寫入控制器方法 接下來在頁面中返回資料 頁面填充資料即可 其間又讓博主頭疼一開始搜尋的詞太過騷氣,導致搜尋無果也是坑了我很久,對這個IK的分詞的配置也不是很瞭解,導致IK的強大的中文分詞沒體現出來,但總的來說你搜索正常的單詞 都可以搜尋的結果。如果小夥伴們做到這一步那麼恭喜你已經成功了,要想要更強大的搜尋功能還得繼續努力 後續補充!!!!!! 想要更精確的分詞搜尋功能只需選擇ik_max_word來代替ik_smart ik_max_word:會將文字做最細粒度的拆分,例如「中華人民共和國國歌」會被拆分為「中華人民共和國、中華人民、中華、華人、人民共和國、人民、人、民、共和國、共和、和、國國、國歌」,會窮盡各種可能的組合; ik_smart:會將文字做最粗粒度的拆分,例如「中華人民共和國國歌」會被拆分為「中華人民共和國、國歌」; 注意注意!!!!!正所謂一到線上各種問題,由於湊巧原因我的第一次安裝JAVA環境非常的好。elasticsearch的坑是真的多,博主的頭都快被錘爛了.為了防止小夥伴重蹈我的覆轍請注意下面的說明:安裝jdk的時候千萬不要裝預設尤其是檔名帶有空格符 elastsearch將不會識別導致你找不到啟動不了elasticsearch 這個坑也是沒誰了,檢視java環境和配置毫無問題就是找不到javahome,弄得博主是真的絕望

弱勢博主,求關注

個人部落格

更多前端技術文章美術設計wordpress外掛、優化教程學習筆記盡在我的個人部落格喵容 - 和你一起描繪生活,歡迎一起交流學習,一起進步:http://panmiaorong.top

站內文章推薦: