欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Elasticsearch】增删改查

程序员文章站 2022-07-05 08:04:42
...

ES的概念

• 分布式的实时文件存储,每个字段都被索引并可被搜索
• 分布式的实时分析搜索引擎
• 可以扩展到上百台服务器,处理PB级结构化非结构化数据

ES的特点

  • JSON存储属于文档存储
  • 采用倒排索引  
  • 没有事务

名词解释

RestFul是一种软件架构的设计风格(不是标准),通过 HTTP接口处理数据,主要用于客户端和服务器的数据交互。

该风格的具体特点:在服务器端,应用程序对象、数据库记录、算法、文本、图片等都是一个实体资源,使用 URI标识,所有资源都共享统一的接口(标准的HTTP方法)比如 GET(获取资源)、PUT(更新资源)、POST(创建或更新资源) 和 DELETE(删除资源),在客户端和服务器之间传输数据。

分词模式:“医药大学”,在搜索时可以看作是“医药”、“大学”、“医药大学”

分布式:1)可扩展支持一主多从且简易扩容,只要cluster.name一致且在同一个网络中就能自动加入当前集群;2)高可用:在一个集群的多个节点中进行分布式存储,索引支持shards和复制,即使部分节点down掉,也能自动进行数据恢复和主从切换。

正排索引:从文档的角度去看其中的单词,表示每个文档含有多少单词,其中每个单词出现多少次,及出现的位置(相对于文档首部的偏移量)。

倒排索引:从单词角度看文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量)。

ES和MYSQL数据库的对应关系

【Elasticsearch】增删改查
 

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