ES的概念
• 分佈式的實時文件存儲,每個字段都被索引並可被搜索
• 分佈式的實時分析搜索引擎
• 可以擴展到上百臺服務器,處理PB級結構化或非結構化數據
ES的特點
- JSON存儲屬於文檔存儲
- 採用倒排索引
- 沒有事務
名詞解釋
RestFul:是一種軟件架構的設計風格(不是標準),通過 HTTP接口處理數據,主要用於客戶端和服務器的數據交互。
該風格的具體特點:在服務器端,應用程序對象、數據庫記錄、算法、文本、圖片等都是一個實體資源,使用 URI標識,所有資源都共享統一的接口(標準的HTTP方法)比如 GET(獲取資源)、PUT(更新資源)、POST(創建或更新資源) 和 DELETE(刪除資源),在客戶端和服務器之間傳輸數據。
分詞模式:“醫藥大學”,在搜索時可以看作是“醫藥”、“大學”、“醫藥大學”
分佈式:1)可擴展支持一主多從且簡易擴容,只要cluster.name一致且在同一個網絡中就能自動加入當前集羣;2)高可用:在一個集羣的多個節點中進行分佈式存儲,索引支持shards和複製,即使部分節點down掉,也能自動進行數據恢復和主從切換。
正排索引:從文檔的角度去看其中的單詞,表示每個文檔含有多少單詞,其中每個單詞出現多少次,及出現的位置(相對於文檔首部的偏移量)。
倒排索引:從單詞角度看文檔,標識每個單詞分別在那些文檔中出現(文檔ID),以及在各自的文檔中每個單詞分別出現了多少次(詞頻)及其出現位置(相對於該文檔首部的偏移量)。
ES和MYSQL數據庫的對應關係
ES常用操作
ES新增:方式/索引/類型/ ID
POST /megacorp/employee/ 1
{ "first_name":"John",
"last_name":"Smith",
"age":25,
"about":"I love to go rock climbing",
"interests":["sports","music"] }
相當於MYSQL裏的:
Insert into megacorp.employee(first_name,last_name,age,about,interests) values ("John","Smith",25, "I love to go rock climbing","sports")
Insert into megacorp.employee(first_name,last_name,age,about,interests) values ("John","Smith",25, "I love to go rock climbing","music")
ES修改:方式/索引/類型/(eg:把smith的about改成‘nothing')
POST /megacorp/employee/_update_by_query
{“query”:{
“match_phrase”:{“last_name”: “Smith”}
},
“script”:{
“source”: “ctx._source[‘about’]=‘nothing'"
}}
相當於MYSQL裏的:
Update megacorp.employee set about=‘nothing’
where last_name like ‘% Smith %’
ES刪除:方式/索引/類型/ID (eg:刪除最後一個名字爲smith的記錄)
POST /megacorp/employee/_delete_by_query
{
“query”:{
“match_phrase”:{“last_name”: “Smith”}}
}
相當於MYSQL裏的:
Delete from megacorp.employee
where last_name like ‘%Smith%’
ES查詢:GET/索引/類型/ _search
1. term查詢和terms查詢
term query會去倒排索引中尋找確切的term,它並不知道分詞器的存在
term:查詢某個字段裏含有某個關鍵詞的文檔
GET /user/student/_search
{
"query": {
"term": {
"name":"lihua"
}
}
}
terms:查詢某個字段裏含有多個關鍵詞的文檔
GET /user/student/_search
{
"query": {
"terms": {
"name": [
"lihua",
"lier"
]
}
}
}
2 match查詢
match query知道分詞器的存在,會對filed進行分詞操作,然後再查詢
GET /user/student/_search
{
"query": {
"match": {
"name":"lihua"
}
}
}
match_all:查詢所有文檔
GET /user/student/_search
{
"query": {
"match_all": {}
}
}
multi_match:可以指定多個字段
GET /user/student/_search
{
"query": {
"multi_match": {
"query": "lihua",
"fields": ["name","course.name"]
}
}
}
match_phrase:短語匹配查詢
GET /user/student/_search
{
"query": {
"match_phrase": {
"name": "lihua"
}
}
}
3. from查詢:
從哪一個文檔開始 size:需要的個數(簡單分頁查詢)
GET /user/student/_search
{
"from": 0,
"size": 2
}
4. Sort實現排序:
desc:降序,asc升序(查詢排序)
GET /user/student/_search
{
"query": {
"match_all": {}
},
"sort": [ { "age": { "order":"asc" } } ]
}
5. 過濾查詢post_filter:
把查詢qury換成post_filter,過濾查詢速度要快一點
GET /user/student/_search
{
"post_filter": {
"match": {
"name": "lihua"
}
}
}
6.條件組合查詢:
POST /user/student/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": "lihua"
}
},
{
"term": {
"age": 12
}
}
]
}
}
}
ES在python中的使用
from elasticsearch import Elasticsearch
#建立連接
es = Elasticsearch(['99.14.234.17'],port=9200)
#新增記錄
body ={"first_name":"Jane","last_name":"Smith","age":32,
"about":"I like to play games", "interests":["tv_games"]} es.index(index="megacorp",doc_type="employee",body=body)
#通過查詢修改相關記錄 body={"script":"ctx._source['last_name']='new_last_name'", "query":{"match":{"age":32}}}
es.update(index="megacorp",doc_type="employee",body=body)
#通過查詢刪除記錄
body={"query":{"match":{"age":32}}} es.delete_by_query(index="megacorp",doc_type="employee",body=body)
#查詢
body={"query":{"match":{"age":32}}}
req = es.search(index="megacorp",doc_type="employee",body=body)
print req