Elasticsearch,為了搜索

Elasticsearch是一個(gè)基于Apache Lucene(TM)的開(kāi)源搜索引擎疗我。無(wú)論在開(kāi)源還是專有領(lǐng)域咆畏,Lucene可以被認(rèn)為是迄今為止最先進(jìn)、性能最好的吴裤、功能最全的搜索引擎庫(kù)旧找。

但是,Lucene只是一個(gè)庫(kù)麦牺。想要使用它钦讳,你必須使用Java來(lái)作為開(kāi)發(fā)語(yǔ)言并將其直接集成到你的應(yīng)用中,更糟糕的是枕面,Lucene非常復(fù)雜愿卒,你需要深入了解檢索的相關(guān)知識(shí)來(lái)理解它是如何工作的。

Elasticsearch也使用Java開(kāi)發(fā)并使用Lucene作為其核心來(lái)實(shí)現(xiàn)所有索引和搜索的功能潮秘,但是它的目的是通過(guò)簡(jiǎn)單的RESTful API來(lái)隱藏Lucene的復(fù)雜性琼开,從而讓全文搜索變得簡(jiǎn)單。

如果沒(méi)有搜索引擎枕荞,單單憑借Mysql提供的簡(jiǎn)單搜索功能柜候,無(wú)論在性能還是效果上都不盡如人意,繼承程序猿的折騰屬性躏精,決定將自己的博客插上Elasticsearch的翅膀渣刷。

安裝 Oracle JDK#

sudo apt-get update
sudo apt-get install openjdk-8-jdk

安裝 Elasticsearch#

  • 下載

    wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-2.3.4.deb    
    sudo dpkg -i elasticsearch-2.3.4.deb
    

    目前ElasticSearch的中文分詞插件IK最高版本為1.9.4,兼容Elasticsearch的2.3.4版本矗烛。

  • 安裝

    sudo dpkg -i elasticsearch-2.3.4.deb
    
  • 開(kāi)機(jī)自啟動(dòng)

    sudo update-rc.d elasticsearch defaults 95 10
    sudo service elasticsearch start
    
  • 測(cè)試

    curl http://localhost:9200
    

你如果你看到以下信息辅柴,說(shuō)明你的ElasticSearch已安裝成功。

{
    "name" : "Peter Petruski",
    "cluster_name" : "elasticsearch",
    "version" : {
        "number" : "2.3.4",
        "build_hash" : "...(隱藏)",
        "build_timestamp" : "2016-06-30T11:24:31Z",
        "build_snapshot" : false,
        "lucene_version" : "5.5.0"
    },
      "tagline" : "You Know, for Search"
}

默認(rèn)情況下 Elasticsearch 的 RESTful 服務(wù)只有本機(jī)才能訪問(wèn)瞭吃,也就是說(shuō)無(wú)法從主機(jī)訪問(wèn)虛擬機(jī)中的服務(wù)碌嘀。為了方便調(diào)試,可以修改

/etc/elasticsearch/config/elasticsearch.yml文件歪架,加入以下兩行:

network.bind_host: “0.0.0.0"
network.publish_host: \_non_loopback:ipv4_

安裝中文分詞插件 IK#

Elasticsearch原裝分詞器會(huì)簡(jiǎn)單地拆分每個(gè)漢字股冗,沒(méi)有根據(jù)詞庫(kù)來(lái)分詞,這樣的后果就是搜索結(jié)果很可能不是你想要的和蚪。這里推薦使用elasticsearch-analysis-ik止状,支持自定義詞庫(kù)烹棉。

  • 下載

    wget https://github.com/medcl/elasticsearch-analysis-ik/archive/v1.9.4.tar.gz
    
  • 解壓

    tar -xvf elasticsearch-analysis-ik.tar.gz
    
  • 使用maven打包該java項(xiàng)目

    cd elasticsearch-analysis-ik-1.9.4
    mvn package
    
  • 在plugins目錄下創(chuàng)建ik目錄,并將打包好的IK插件解壓到其中

    mkdir /usr/share/elasticsearch/plugins/ik
    unzip target/releases/elasticsearch-analysis-ik-1.9.4.zip -d /usr/share/elasticsearch/plugins/ik/
    

    elasticsearch-analysis-ik 的配置文件在

    ~/{es_root}/plugins/ik/config/ik/

    目錄怯疤,很多都是詞表峦耘,直接用文本編輯器打開(kāi)就可以修改,改完記得保存為 utf-8 格式旅薄。

現(xiàn)在再啟動(dòng) Elasticsearch 服務(wù)辅髓,如果看到類似下面這樣的信息,說(shuō)明 IK Analysis 插件已經(jīng)裝好了

plugins [analysis-ik]

使用 Elasticsearch#

在使用之前少梁,先大概了解下ES的特點(diǎn):

網(wǎng)上通常會(huì)將Elasticsearch和傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)Mysql做一下類比:

MySQL Elasticsearch
Database(數(shù)據(jù)庫(kù)) Index (索引)
Table(表) Type (類型)
Row (行) Document (文檔)
Column (列) Field (字段)
Schema (方案) Mapping (映射)
Index (索引) Everything Indexed by default (所有字段都被索引)
SQL (結(jié)構(gòu)化查詢語(yǔ)言) Query DSL (查詢專用語(yǔ)言)

Elasticsearch不僅僅是全文搜索:

  • 分布式的實(shí)時(shí)文件存儲(chǔ)洛口,每個(gè)字段都被索引并可被搜索
  • 分布式的實(shí)時(shí)分析搜索引擎
  • 可以擴(kuò)展到上百臺(tái)服務(wù)器,處理PB級(jí)結(jié)構(gòu)化或非結(jié)構(gòu)化數(shù)據(jù)

分布式凯沪、實(shí)時(shí)第焰、每個(gè)字段PB級(jí)妨马,有點(diǎn)不明覺(jué)厲~ 不要慌挺举,剛認(rèn)識(shí)不熟悉很正常,慢慢接觸烘跺,自然就熟絡(luò)了湘纵,stop getting off track(回歸正題),想要詳細(xì)認(rèn)識(shí)ES滤淳,請(qǐng)移步Elasticsearch權(quán)威指南梧喷,接下來(lái)就是一步步將ES集成進(jìn)項(xiàng)目當(dāng)中:

1. 使用package

可以直接使用官方提供的package,由于不想花時(shí)間重復(fù)造輪子脖咐,我直接使用進(jìn)一步封裝的第三方package铺敌。在github上有好幾個(gè)可用的,我選了Elasticquent屁擅,部分是因?yàn)槊趾蚻aravel的Eloquent比較搭(笑...)偿凭。Elasticquent提供了簡(jiǎn)潔好用的trait,直接集成進(jìn)你的Model里派歌,例如Article:

...
use Elasticquent\ElasticquentTrait;

class Article extends Model
{
    use ElasticquentTrait;
        ...
}

然后就可以優(yōu)雅的使用Elasticsearch了弯囊,具體如何安裝使用,請(qǐng)參考Elasticquent的說(shuō)明文檔硝皂。

2. 配置Mapping

關(guān)于Mapping(映射)常挚,我找到了一篇專門介紹它的文章(傳送們),通俗易懂稽物。

文章中提到,mapping不僅告訴ES一個(gè)field中是什么類型的值折欠, 它還告訴ES如何索引數(shù)據(jù)以及數(shù)據(jù)是否能被搜索到贝或。

Got it! 也就是說(shuō)吼过,如果我們不配置mapping,那ES就不會(huì)知道我們是想讓它按照IK的分詞方式來(lái)進(jìn)行索引咯~

到這里咪奖,不得不說(shuō)這是一個(gè)坑盗忱,目前網(wǎng)上的很多資料因?yàn)槭褂玫氖抢习姹镜腅S和IK,所以index和mapping的配置一般都放在es的配置文件yml當(dāng)中羊赵。但我按照那種配置方法趟佃,并沒(méi)有達(dá)到預(yù)期的分詞效果,ES還是簡(jiǎn)單粗暴的將漢字一個(gè)個(gè)的切開(kāi)昧捷,屢敗屢戰(zhàn)折騰兩天之后闲昭,終于想到試著使用Elasticquent說(shuō)明文檔里在Model中配置mapping的方式,果然靡挥,豁然開(kāi)朗:

curl -XGET 'http://localhost:9200/_analyze?analyzer=ik&pretty=true&text=%e4%bd%a0%e5%a5%bd%e9%ba%a6%e8%82%af%e5%85%88%e7%94%9f'
{   
    "tokens" : [ {
        "token" : "你好",
           "start_offset" : 0,
        "end_offset" : 2,
        "type" : "CN_WORD",
        "position" : 0
    },
    {
        "token" : "麥",
        "start_offset" : 2,
        "end_offset" : 3,
        "type" : "CN_WORD",
        "position" : 1
    }, {
        "token" : "肯",
        "start_offset" : 3,
        "end_offset" : 4,
        "type" : "CN_WORD",
    "position" : 2
    }, {
        "token" : "先生",
        "start_offset" : 4,
        "end_offset" : 6,
        "type" : "CN_WORD",
        "position" : 3
    }]
}

附上我的mapping配置代碼

protected $mappingProperties = array(
   'title' => array(
        'type' => 'string',
        'analyzer' => 'ik_max_word'
    ),
   'content' => array(
        'type' => 'string',
        'analyzer' => 'ik_max_word'
    )
);

可以看出序矩,我告訴ES,我的title和content字段是string類型而且請(qǐng)按照ik的分詞方式幫我檢索跋破。

3. 創(chuàng)建索引

直接使用Elasticquent提供的createIndex方法創(chuàng)建簸淀,如果想把現(xiàn)有文檔全部索引,可以使用addAllToIndex方法毒返,簡(jiǎn)單愉快租幕。

Article::createIndex($shards = null, $replicas = null);
Article::addAllToIndex();

4. 增刪改查

在你的控制器里的增刪改查方法中,將Elasticquent提供的相應(yīng)操作索引的方法依次加上即可拧簸,完成之后令蛉,那么你對(duì)文檔的操作就會(huì)同步ES的索引了。具體代碼請(qǐng)直接移步Elasticquent開(kāi)源項(xiàng)目中trait里的代碼就好狡恬,這里不再貼出珠叔。

寫(xiě)在最后#

在此之前,了解過(guò)sphinx弟劲,使用過(guò)配置好的xunsearch祷安,但真正自己從零開(kāi)始研究全文搜索引擎還是頭一次,中間遇到了許多坑兔乞,雖然被坑郁悶汇鞭,但也感謝這些坑,畢竟越過(guò)去就會(huì)有快感庸追。寫(xiě)這篇文章一來(lái)作為紀(jì)念和起點(diǎn)霍骄,二來(lái)希望能多少對(duì)別人有點(diǎn)幫助,因?yàn)槲乙彩强催^(guò)好多相關(guān)的文章才一點(diǎn)點(diǎn)將ES搭建完成淡溯,在這里感謝那些樂(lè)于分享的前輩读整。

當(dāng)然,Elasticsearch功能很強(qiáng)大咱娶,各種插件各種配置米间,這篇文章需要完善的地方還有很多强品,后期會(huì)不斷更新,如果文中有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤角瑲g迎留言交流的榛。

PS. 最后貼出我項(xiàng)目中的Dockerfile,方便感興趣的同學(xué)使用逻锐。

原文鏈接:https://macken.me/article/elasticsearch-for-search
https://laravel-china.org/articles/2765/elasticsearch-in-order-to-search

參考資料#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夫晌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昧诱,更是在濱河造成了極大的恐慌晓淀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄哭,死亡現(xiàn)場(chǎng)離奇詭異要糊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)妆丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門锄俄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人勺拣,你說(shuō)我怎么就攤上這事奶赠。” “怎么了药有?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵毅戈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我愤惰,道長(zhǎng)苇经,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任宦言,我火速辦了婚禮扇单,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奠旺。我一直安慰自己蜘澜,他們只是感情好懂版,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布舀射。 她就那樣靜靜地躺著,像睡著了一般瓤的。 火紅的嫁衣襯著肌膚如雪忿晕。 梳的紋絲不亂的頭發(fā)上装诡,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼慎王。 笑死蚓土,一個(gè)胖子當(dāng)著我的面吹牛宏侍,可吹牛的內(nèi)容都是我干的赖淤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谅河,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咱旱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绷耍,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吐限,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后褂始,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诸典,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年崎苗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狐粱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胆数,死狀恐怖肌蜻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情必尼,我是刑警寧澤蒋搜,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站判莉,受9級(jí)特大地震影響豆挽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜券盅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一帮哈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渗饮,春花似錦但汞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胡桃,卻和暖如春踩叭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工容贝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留自脯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓斤富,卻偏偏與公主長(zhǎng)得像膏潮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子满力,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容