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