爲你的站點插上ElasticSearch的翅膀

原文來自:https://jellybool.com/post/setup-slasticsearch-on-your-websitephp

在個人博客按Shift+S就能夠呼出搜索框,能夠直接體驗一下現實的Demojava

替代文字

ElasticSearch憑藉強大的API和不俗的搜索性能,目前在搜索引擎領域的勢頭貌似愈來愈猛了,處於興趣緣由,本身就花了點時間將本身的博客搜索插上了ElasticSearch的翅膀。python

安裝Oracle JDK

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

由於ElasticSearch底層其實就是lucene,因此,須要javagit

若是以上第一行命令出現command not found,採起下面的解決方案,有兩個須要注意的地方:github

sudo apt-get install python-software-properties
 sudo apt-get install software-properties-common

注:若是你想安裝OpenJDK,請用如下命令,不過這個我並無親自測試過。web

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.0json

你能夠到這裏查看:oracle

https://www.elastic.co/downloads/elasticsearchapp

安裝之:composer

sudo dpkg -i elasticsearch-1.7.0.deb

開機自啓動,

sudo update-rc.d elasticsearch defaults 95 10

sudo /etc/init.d/elasticsearch start

測試

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 ModelElasticSearch關聯起來--就只是使用一個trait而已!好比,我須要用Article Model做爲示例:

use Fadion\Bouncy\BouncyTrait;

class Article extends Eloquent {

    use BouncyTrait;

    // ...other Eloquent attributes
    // or methods.
}

沒錯,這樣就能夠了。

索引全部的文章

這裏咱們在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')); }

在這裏咱們只是指定了對文章的title進行匹配,你也能夠將content做爲匹配域。而highlight選項的配置是爲了在視圖中高亮匹配的內容:

{!! $article->highlight('title') !!}

這樣,一個完整的搭建ElasticSearch的過程就完成了。

Todo

在實現的過程當中,貌似ElasticSearch對中文的支持不是那麼好,因此接下來會嘗試使用一下中文分詞器來看看效果,順利的話會再出一篇文章。

  1. 中文分詞器

Happy Hacking

相關文章
相關標籤/搜索