【Elasticsearch】增删改查

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.条件组合查询:

查询名字为lihua,年龄12岁的数据

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章