ElasticSearch是一個基于Lucene的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎填帽,基于RESTful web接口评也。Elasticsearch是用Java開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布悔政,是當(dāng)前流行的企業(yè)級搜索引擎翁涤。設(shè)計(jì)用于云計(jì)算中桥言,能夠達(dá)到實(shí)時(shí)搜索,穩(wěn)定葵礼,可靠号阿,快速,安裝使用方便鸳粉。
關(guān)系型數(shù)據(jù)庫的缺點(diǎn)
- 無法打分
- 無分布式
- 無法解析搜索請求
- 效率低
- 無法分詞
elasticsearch
安裝elasticsearch
1.安裝java jdk
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.安裝elasticsearch
官網(wǎng):http://www.elastic.co/products/elasticsearch
但是由于官網(wǎng)提供的elasticsearch帶的插件不多扔涧,所以我們不使用這個。
我們使用elasticsearch-rtf:https://github.com/medcl/elasticsearch-rtf
3.運(yùn)行
Mac/Linux:
cd elasticsearch/bin
./elasticsearch
sudo -u ops ES_JAVA_OPTS="-Xms2024m -Xmx2024m" ./bin/elasticsearch -d
Windows:
cd elasticsearch/bin
elasticsearch.bat
4.訪問 127.0.0.1:9200
如果運(yùn)行出現(xiàn)下面的錯誤:
Error occurred during initialization of VM
Could not reserve enough space for object heap
是由于內(nèi)存空間不足届谈,可以考慮更改默認(rèn)內(nèi)存的大小枯夜。用編輯器打開自己的elasticsearch路徑\config\jvm.options
文件,可以看到
-Xms2g
-Xmx2g
改成512m即可
-Xms512m
-Xmx512m
保存之后艰山,重新運(yùn)行
安裝elasticsearch-head插件湖雹,來可視化elasticsearch數(shù)據(jù)(相當(dāng)于navicat)
Running with built in server
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
-
由于elasticsearch默認(rèn)不允許第三方插件來連接,所以我們需要在elasticsearch-rtf目錄中的elasticsearch.yml中修改配置曙搬,添加下面幾行代碼摔吏,注意:
之后有空格鸽嫂。
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS,HEAD,GET,POST,PUT,DELETE
http.cors.allow-headers: "X-Requested-With,Content-Type,Content-Length,X-User"
重啟elasticsearch之后,查看 http://localhost:9100/征讲,顯示如下据某,即表示連接上了elasticsearch服務(wù)器
安裝Kibana
kibana的版本必須要跟elasticsearch版本一致,可以通過127.0.0.1:9200查看elasticsearch的版本
進(jìn)入kibana下載頁面:http://www.elastic.co/downloads/kibana
下載完成后運(yùn)行文件里面的命令稳诚,訪問127.0.01:5601哗脖,進(jìn)入Dev Tools下
我們將重點(diǎn)使用這個控制臺來操作elasticsearch
elasticsearch概念
- 集群:一個或者多個節(jié)點(diǎn)組織在一起
- 節(jié)點(diǎn):一個節(jié)點(diǎn)是集群中的一個服務(wù)器瀑踢,由一個名字來標(biāo)識扳还,默認(rèn)是一個隨機(jī)的漫威角色的名字
- 分片:將索引劃分為多份的能力,允許水平分割和擴(kuò)展容量橱夭,多個分片響應(yīng)請求氨距,提供性能和吞吐量
- 副本:創(chuàng)建分片的一份或多份的能力,在一個節(jié)點(diǎn)失敗棘劣,其他節(jié)點(diǎn)可以頂上
elasticsearch概念
elasticsearch | mysql |
---|---|
index(索引) | 數(shù)據(jù)庫 |
type(類型) | 表 |
document(文檔) | 行 |
fields | 列 |
倒排索引
倒排索引源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來查找記錄俏让。這種索引表中的每一項(xiàng)都包含一個屬性值和具有該屬性值得各記錄的地址。由于不是由記錄來確定屬性值茬暇,而是由屬性值來確定記錄的位置首昔,因而稱為倒敘索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件糙俗,檢查倒排文件(inverted file)勒奇。案例,對存儲的數(shù)據(jù)進(jìn)行分詞巧骚。
例如:python寫各大聊天系統(tǒng)的屏蔽臟話功能原理
關(guān)鍵詞 | 文章 |
---|---|
python | 文章1赊颠,文章3 |
聊天 | 文章2 |
系統(tǒng) | 文章3,文章4 |
屏蔽臟話 | 文章5 |
功能原理 | 文章6劈彪,文章7竣蹦,文章8 |
關(guān)鍵詞 | 文章 |
---|---|
python | 文章1,<2沧奴,10>痘括,2 |
聊天 | 文章2,<12滔吠,25纲菌,100>,3 |
系統(tǒng) | 文章3屠凶,<10>驰后,1 |
屏蔽臟話 | 文章5,<50矗愧,60>,2 |
功能原理 | 文章6灶芝,<56郑原,57,58>夜涕,3 |
倒排索引待解決的問題
- 大小寫轉(zhuǎn)換問題犯犁,如python和PYTHON應(yīng)該為一個詞
- 詞干抽取,look和looking應(yīng)該處理為一個詞
- 分詞女器,若屏蔽系統(tǒng)酸役,應(yīng)該分詞為屏蔽,系統(tǒng)驾胆,還是應(yīng)該是屏蔽系統(tǒng)
- 倒排索引文件過大-壓縮編碼
- tf-id的簡單介紹
elasticsearch數(shù)據(jù)庫的操作涣澡,包括增刪改查
創(chuàng)建lagou索引
number_of_shards:分片的數(shù)量
number_of_replicas:備份的數(shù)量
運(yùn)行,在head中就可以看到創(chuàng)建的索引庫
我們也可以在head中自己添加索引
獲取lagou中setting信息
GET lagou/_settings
獲取所有索引下的setting信息
GET _all/_settings
或者
GET _settings
獲取指定索引下的setting信息
GET .kibana,lagou/_settings
獲取所有的索引信息
GET _all
更新數(shù)據(jù)
1.修改分片數(shù)量為2
PUT lagou/_settings
{
"number_of_replicas": 2
}
保存文檔(type)到索引中去
PUT lagou/job/1
{
"title":"python",
"salary":15000,
"company":{
"name":"baidu",
"comapny_addr":"北京市軟件園"
},
"publish_date":"2017-4-16",
"comments":15
}
lagou是索引丧诺,job是type入桂,1是數(shù)據(jù)的id
其實(shí)我們也可以不用指明id,ES會自動生成
POST lagou/job/
{
"title":"Django",
"salary":30000,
"company":{
"name":"Meituan",
"comapny_addr":"杭州市西湖區(qū)"
},
"publish_date":"2017-4-16",
"comments":30
}
在head中查看數(shù)據(jù)
獲取文檔
GET lagou/job/1
獲取文檔中指定字段
GET lagou/job/1?_source=title,salary
修改文檔
POST lagou/job/1/_update
{
"doc":{
"comments":20
}
}
刪除
1.刪除文檔
DELETE lagou/job/1
2.刪除索引
DELETE lagou
ES的批量操作
新建一個索引testdb驳阎,插入數(shù)據(jù)如下
1.一次性查詢多條數(shù)據(jù)
GET _mget
{
"docs":[
{"_index":"testdb",
"_type":"job1",
"_id":1
},
{"_index":"testdb",
"_type":"job2",
"_id":2
}
]
}
GET testdb/job1/_mget
{
"ids":[1,2]
}
2.bulk 批量操作
批量導(dǎo)入可以合并多個操作抗愁,比如index,delete呵晚,update蜘腌,create等等。也可以從一個索引導(dǎo)入到另一個索引中去饵隙。
一定是按照這種格式寫撮珠,不要寫成上面美化的格式
映射(mapping)
映射:當(dāng)我們創(chuàng)建索引的時(shí)候,可以預(yù)先定義字段的類型以及相關(guān)屬性
ES會根據(jù)JSON源數(shù)據(jù)的基礎(chǔ)類型猜測你想要的字段映射癞季。將輸入的數(shù)據(jù)轉(zhuǎn)變?yōu)榭伤阉鞯乃饕?xiàng)劫瞳。Mapping就是我們自己定義的字段的數(shù)據(jù)類型,同時(shí)告訴ES(即通過設(shè)置相關(guān)屬性)如何索引數(shù)據(jù)以及可以被搜索绷柒。
作用:會讓索引建立變的更加細(xì)致和完善
類型:靜態(tài)映射和動態(tài)類型
內(nèi)置類型
- string類型:text志于,keyword(string類型在es5開始已經(jīng)廢棄)
- 數(shù)字類型:long,interger,short,byte,double,float
- 日期類型:date
- bool類型:boolean
- binary類型:binary
- 復(fù)雜類型:object,nested
- geo類型:geo-point,geo-shape
- 專業(yè)類型:ip废睦,competion
安裝自己的要求創(chuàng)建索引
PUT lagoujob
{
"mappings": {
"job":{
"properties": {
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"salary":{
"type": "integer"
},
"city":{
"type": "keyword"
},
"company":{
"properties": {
"name":{
"type":"text"
},
"company_addr":{
"type":"text"
},
"employee_count":{
"type":"integer"
}
}
},
"pulish_date":{
"type": "date",
"format": "yyyy-MM-dd"
},
"comments":{
"type": "integer"
}
}
}
}
}
插入一條數(shù)據(jù)
PUT lagoujob/job/1
{
"title":"python",
"salary":15000,
"city":"BeiJing",
"company":{
"name":"baidu",
"comapny_addr":"北京市軟件園",
"employee_count":50
},
"publish_date":"2017-4-16",
"comments":15
}