為你的站點插上ElasticSearch的翅膀

lple68 9年前發布 | 25K 次閱讀 ElasticSearch 搜索引擎

 為你的站點插上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 10

sudo /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

本文由 JellyBool 創作,采用 知識共享署名-相同方式 3.0 中國大陸許可協議 進行許可。
轉載、引用前需聯系作者,并署名作者且注明文章出處。
 本文由用戶 lple68 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!