為你的站點插上ElasticSearch的翅膀
ElasticSearch憑借強大的API和不俗的搜索性能,目前在搜索引擎領域的勢頭貌似越來越猛了,處于興趣原因,自己就花了點時間將自己的博客搜索插上了ElasticSearch的翅膀。
安裝Oracle JDK
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-installer
因為ElasticSearch底層其實就是lucene,所以,需要java
如果以上第一行命令出現command not found,采取下面的解決方案,有兩個需要注意的地方:
</blockquote>sudo apt-get install python-software-properties sudo apt-get install software-properties-common注:如果你想安裝OpenJDK,請用以下命令,不過這個我并沒有親自測試過。
sudo apt-get update sudo apt-get install openjdk-8-jre-headless -y下載并安裝ElasticSearch
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.7.0.deb sudo dpkg -i elasticsearch-1.7.0.deb目前ElasticSearch的最新穩定版為1.7.0,如果之后版本有升級,請將相應的版本號替換掉上面的1.7.0。
你可以到這里查看:
https://www.elastic.co/downloads/elasticsearch
安裝之:
sudo dpkg -i elasticsearch-1.7.0.deb開機自啟動,
sudo update-rc.d elasticsearch defaults 95 10sudo /etc/init.d/elasticsearch start</pre>
測試
curl http://localhost:9200你將看到類似以下的信息:
{ "status" : 200, "version" : { "number" : "1.7.0", "build_timestamp" : "2015-07-16T14:31:07Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }這樣其實你已經將ElasticSearch安裝成功了。
為Laravel項目安裝相應的ElasticSearch composer package
當然,這些package有幾個都很不錯,而我個人使用的是Bouncy在composer.json里添加該package信息
"require": { "fadion/bouncy": "dev-l5" }然后執行,composer update
添加Service provider
來到config/app.php,在providers處添加:
'Fadion\Bouncy\BouncyServiceProvider',最后執行:
php artisan vendor:publish這樣之后,你在config/目錄就會得到兩個個配置文件
config/bouncy.php config/elasticsearch.php第一個是關于Bouncypackage的簡單配置,第二個是關于ElasticSearch的具體配置,你可以直接打開來看看,如果沒有什么必要,你可以目前保持文件不變。
安裝完之后,我們怎么使用呢?其實很簡單,Bouncy提供一種非常簡單的方式將Laravel的Eloquent Model與ElasticSearch關聯起來--就只是使用一個trait而已!比如,我需要用Article Model作為示例:
use Fadion\Bouncy\BouncyTrait;class Article extends Eloquent {
use BouncyTrait; // ...other Eloquent attributes // or methods.
}</pre>
沒錯,這樣就可以了。
索引所有的文章
這里我們在ArticleController實現索引所有的文章:
public function indexAllArticle() { return Article::all()->index(); }嗯,就是這么簡單的,就像正常使用Eloquent一樣,不過是在后面多使用一個index()方法。
在這里的使用請確保你的ElasticSearch服務是在正常運行期間。
而且還有一個好處就是,Bouncy在你開啟auto_index的情況下,會自動在你創建和保存文件的時候自動將文章索引了,至于更多詳細的用法,你可以查看詳細的文檔。
開啟搜索
<h1>Type something to search...</h1> {!! Form::open(['url'=>'/search','method'=>'get']) !!} <div class="form-group"> <input class="form-control" autofocus="true" name="query" id="query" type="text"/> </div> {!! Form::close() !!}我們在blade文件中創建一個搜索表單,并指定表單的提交方式為GET。
設置路由
Route::get('/search','ArticleController@search');編寫search()方法
由于我們是直接使用GET的方式來傳遞參數,所以這里的示例僅是一些簡單的代碼:
public function search() { if ( isset($_GET['query']) && !empty($_GET['query']) ) { $query = $_GET['query']; } $params = [ 'query' => [ 'match' => [ 'title' => $query ] ], 'highlight' => [ 'fields' => [ 'title' => new \stdClass ] ], 'size' => 20 ];$articles = Article::search($params); return view('article.search', compact('articles')); }</pre> <p>在這里我們只是指定了對文章的title進行匹配,你也可以將content作為匹配域。而highlight選項的配置是為了在視圖中高亮匹配的內容: </p>
{!! $article->highlight('title') !!}這樣,一個完整的搭建ElasticSearch的過程就完成了。
Todo
在實現的過程中,貌似ElasticSearch對中文的支持不是那么好,所以接下來會嘗試使用一下中文分詞器來看看效果,順利的話會再出一篇文章。
1.中文分詞器
Happy Hacking