後端

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 安裝

這裡不知道為什麼小編安裝的失敗的經過了,百度了很多最終無果在我嘗試重新找了個安裝
https://pan.baidu.com/s/1pJNkrUV

安裝好以後啟動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外掛、優化教程學習筆記盡在我的個人博客喵容 – 和你一起描繪生活,歡迎一起交流學習,一起進步:https://www.miaoroom.com

View Comments

Recent Posts

2023 年 WordPress 中最棒的多語言翻譯外掛推薦

擔心如何翻譯您的網站語言以支持…

12月 ago

2023 年 WordPress 中最棒的可視化頁面構建器外掛推薦

在設計任何頁面或網站時,對於不…

12月 ago

Ella 多用途 Shopify 佈景主題

Shopify 佈景主題市場上有許…

12月 ago

AI Engine Pro

喵容今天帶來的 AI Engi…

12月 ago

AIKit

喵容今天為您帶來 AIKit …

12月 ago

AIomatic

喵容今天為您帶來AIOmati…

12月 ago