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