开始接触 ES 还没熟悉它的一些 CRUD,这里记录一下,方便查看

排序

  1. 对多个字段进行排序
    1. POST /索引/_search
    2. {
    3. "size": 5,
    4. "query": {
    5. "match_all": {
    6. }
    7. },
    8. "sort":[
    9. {"order_date":{"order":"desc"}},
    10. {"_doc":{"order":"asc"}},
    11. {"_score":{"order":"desc"}}
    12. ]
    13. }


查看集群健康状态:GET /_cluster/health
查看所有节点:GET /_cat/nodes
查看文档总数:GET _count
查看所有索引的内容,只返回10条,可以查看文档格式:GET /_search
查看某个索引的内容,只返回10条:GET /{索引名称}/_search
查看所有索引:GET /_cat/indices
查看指定索引名称的内容:GET /索引1,索引2/_search
查看模糊匹配所有索引内容:GET /索引名称*/_search
简单查询某个索引指定字段:GET /索引名称/_search?q=field1:value1
简单查询某个索引不指定字段(泛查询):GET /索引名称/_search?q=value1
查询一个指定的文档id:GET {索引名称}/{类型}/{文档id} ,默认类型是 _doc
简单查询举例:GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10

  1. // 查询movies索引中有 2012 的单词,df不指定就会对所有字段进行查询,sort用来排序
  2. // fromsize 用来分页,profile 用来查看查询时如何执行的
  3. {
  4. "profile": "true"
  5. }

查询所有:GET /users/_search

  1. {
  2. "query":{
  3. "match_all":{
  4. }
  5. },
  6. "size":1 // 只返回一条内容
  7. }

创建一个文档自动生成id:POST {索引名称}/{类型} ,默认类型是 _doc

  1. {
  2. "user" : "Mike",
  3. "post_data": "2019-10-12 22:23:22",
  4. "message": "trying out Kibana"
  5. }

更新一个指定的文档id:PUT {索引名称}/{类型}/{文档id} ,默认类型是 _doc

  1. {
  2. "user" : "Jack",
  3. "post_data": "2019-10-12 22:23:22",
  4. "message": "Jack trying out Kibana"
  5. }

添加一个指定文档上的字段:POST {索引名称}/_update/{文档id}

  1. {
  2. "doc": {
  3. "post_date": "2019-10-13 22:23:22"
  4. }
  5. }

批量更新/添加索引bulk操作:POST /{索引名称}/_bulk ,这里的json格式不能是pretty

  1. { "index": {"_id": 1}} // id 1
  2. { "title": "Father of the Bridge Part II", "year":1995,"genre":"Comedy"} // 内容
  3. { "index": {"_id": 2}} // id 2
  4. { "title": "Dave", "year":1993,"genre":["Comedy","Romance"]} // 内容

批量获取mget操作:GET _mget

  1. {
  2. "docs":[
  3. {
  4. "_index":"user", // 获取索引是userid1的文档
  5. "_id":1
  6. },
  7. {
  8. "_index":"comment", // 获取索引是commentid1的文档
  9. "_id":1
  10. }
  11. ]
  12. }

批量查询 msearch:POST users/_msearch

  1. {}
  2. {"query":{"match_all":{}},"size":1}}
  3. {"index":"users"}
  4. {"query":{"match_all":{}},"from":1,"size":2}}

查询某个字段的范围:GET products/_search

  1. {
  2. "query": {
  3. "constant_score": {
  4. "filter": {
  5. "range": {
  6. "price": { // 查找价格
  7. "gte": 20, // 大于等于20
  8. "lte": 30 // 小于等于30
  9. }
  10. }
  11. }
  12. }
  13. }
  14. }

查询包含某个字段:POST /{索引名称}/_search

  1. {
  2. "query": {
  3. "constant_score": {
  4. "filter": {
  5. "term": {
  6. "genre.keyword": "Comedy" // 查询genre中包含Comedy的文档记录
  7. }
  8. }
  9. }
  10. }
  11. }

bool多条件查询:POST /{索引名称}/_search

  1. {
  2. "query":{
  3. "bool": {
  4. "should": [
  5. {
  6. "match": {
  7. "title": { // 查询title这个字段
  8. "query": "apple,iPad",
  9. "boost": 1.1 // boost 相关性打 分,该值越高,得分就越高
  10. }
  11. }
  12. },
  13. {
  14. "match": {
  15. "content": { // 查询 content 这个字段
  16. "query": "apple,iPad,apple,iPad",
  17. "boost": 1
  18. }
  19. }
  20. }
  21. ]
  22. }
  23. }
  24. }

删除某个索引:DELETE 索引名称

给某个索引批量添加数据:

  1. # articles 是索引
  2. POST articles/_bulk
  3. { "index": {}}
  4. { "body":"lucene is very cool"}
  5. { "index": {}}
  6. { "body":"elasticsearch builds on top of lucene"}
  7. { "index": {}}
  8. { "body":"elastic is the company behind ELK stack"}
  9. { "index": {}}
  10. { "body":"ELK stack rocks"}
  11. { "index": {}}
  12. { "body":"elasticsearch is rock solid"}
  13. { "index": {}}
  14. { "body":"elasticsearch is rock solid","title":"test-title"}

重点!重点!!

简单查询

查询所有

GET /_search

查询某个索引中的

GET /{index}/_search

查询多个索引中的

GET /{index1,index2}/_search

分片查询

from 表示从第几个开始;’size 表示返回数量,默认10。
GET /movies/_search?from=1&size=2

轻量搜索

所有索引为movies下title字段有Them的文档记录
GET /movies/_search?q=title:Them

请求体查询

query 参数

查询 last_name 属性值为 Smith 的文档记录

  1. GET /_search
  2. {
  3. "query" : {
  4. "match" : {
  5. "last_name" : "Smith"
  6. }
  7. }
  8. }

match:精确查询或全文搜索,term 之间是 or 关系

  1. GET /movies/_search
  2. {
  3. "query" : {
  4. "match": {
  5. "title": "Werewolf"
  6. }
  7. }
  8. }

match_all:查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询
match_phrase:term 之间是 and 关系,并且 term 之间的位置也影响查询结果
match_phrase_prefix:
multi_match:

bool 参数

可以组合和嵌套,有4个子句,两种会影响打分,两种不影响打分
image.png

  1. // 子查询的位置可以任意,如果bool查询中,没有must条件,should中必须至少满足一个查询
  2. // 每个子查询又可以嵌套bool查询
  3. POST /{索引名称}/_search
  4. {
  5. "query": {
  6. "bool": {
  7. "must": {
  8. "term": {"price":"30"}
  9. },
  10. "filter": {
  11. "term": {"avaliable":"true"}
  12. },
  13. "must_not": {
  14. "range": {
  15. "price": {"lte":10} // 小于等于 10
  16. }
  17. },
  18. "should": [ // 数组多个条件
  19. {"term": {"produceID.keyword":"a-1-1"}},
  20. {"term": {"produceID.keyword":"b-2-2"}}
  21. ],
  22. "minimum_should_match": 1
  23. }
  24. }
  25. }
  1. // 多条件查询
  2. POST /{索引名称}/_search
  3. {
  4. "query": {
  5. "boosting": { // 打分机制
  6. "positive": { // 正向打分
  7. "match": {
  8. "content": "apple"
  9. }
  10. },
  11. "negative": { // 逆向打分
  12. "match": {
  13. "content": "pie"
  14. }},
  15. "negative_boost": 0.2
  16. }
  17. }
  18. }

filter 参数

使用filter进行查询,其结果可以被缓存

term 参数

term 查询包含关系,并不是完全相等

精确匹配搜索

模糊匹配搜索

分词全文搜索

多条件搜索

高亮

指定关键字返回

scroll 查询

分页查询 from size

默认只能 10000 条,如果要取消这个限制,修改属性:index.max_result_window
但官方更推荐这两个属性来进行分页:scrollsearch_after

  1. GET /_search
  2. {
  3. "from": 5,
  4. "size": 20,
  5. "query": {
  6. "match": {
  7. "user.id": "kimchy"
  8. }
  9. }
  10. }

聚合查询

添加文档

PUT http://localhost:9200/{索引名称}/{类型}/{文档id}
添加并指定的文档id

  1. {
  2. "name": "老人与海",
  3. "desc": "文学",
  4. "price": 33.9
  5. }

得到如下结果:

  1. {
  2. "_index": "book",
  3. "_type": "out",
  4. "_id": "1",
  5. "_version": 1,
  6. "result": "created",
  7. "_shards": {
  8. "total": 2,
  9. "successful": 2,
  10. "failed": 0
  11. },
  12. "_seq_no": 0,
  13. "_primary_term": 1
  14. }

或者
POST http://localhost:9200/{索引名称}/{类型}
使用es分配的文档id

  1. POST /website/blog
  2. {
  3. "name": "老人与海",
  4. "author": "海明威"
  5. }

_create

Bulk 操作

在一次 api 的调用中,对不同的索引进行操作,操作中的单条失败不影响其他操作,其返回结果包括了每一条的操作结果。支持以下四种类型操作:

  1. {
  2. "doc": {
  3. "name": "老人与海-2"
  4. }
  5. }


并发情况下可以使用版本号来控制,只有 version 等于1的时候才修改:

  1. PUT /website/blog/1?version=1
  2. {
  3. "title": "My first blog entry",
  4. "text": "Starting to get the hang of this..."
  5. }

删除文档

DELETE http://localhost:9200/{索引名称}/{类型}/{文档id}

查询文档

返回文档指定字段:

  1. GET /megacorp/employee/1?_source=age,last_name

返回文档所有字段:

  1. GET /megacorp/employee/1

不返回元数据信息:

  1. GET /megacorp/employee/1/_source

快速查看一个文档是否存在,存在会返回200,不存在返回404:

  1. curl -i -I http://localhost:9200/website/_doc/123

索引创建

创建索引名称为 blogs,分配3个主分片和1个复制分片

  1. PUT /blogs
  2. {
  3. "settings" : {
  4. "number_of_shards" : 3,
  5. "number_of_replicas" : 1
  6. }
  7. }

在索引 megacorp 内创建一个 employee 文档类型,该文档的id是1,文档内容是这个employee个人信息

  1. PUT /megacorp/employee/1
  2. {
  3. "first_name" : "John",
  4. "last_name" : "Smith",
  5. "age" : 25,
  6. "about" : "I love to go rock climbing",
  7. "interests": [ "sports", "music" ]
  8. }

索引查询

POST http://localhost:9200/{索引名称}/_search

具体查询和MySQL一样,有很多种姿势,需要多多练习

查看某个索引文档类型下文档id为1的文档记录

  1. GET /megacorp/employee/1

查看该索引文档中所有文档信息:

  1. GET /megacorp/employee/_search

使用简单查询,条件等值查询,last_name等于Smith的文档信息:

  1. GET /megacorp/employee/_search?q=last_name:Smith

使用表达式进行查询,用match匹配,last_name等于Smith的文档信息(表达式查询非常强大):

  1. GET /megacorp/employee/_search
  2. {
  3. "query" : {
  4. "match" : {
  5. "last_name" : "Smith"
  6. }
  7. }
  8. }

使用表达式进行复杂条件查询,用match模糊匹配,filter过滤,last_name为smith,age大于30的文档信息:
match:模糊匹配
match_phrase: 等值匹配

  1. GET /megacorp/employee/_search
  2. {
  3. "query" : {
  4. "bool": {
  5. "must": {
  6. "match" : {
  7. "last_name" : "smith"
  8. }
  9. },
  10. "filter": {
  11. "range" : {
  12. "age" : { "gt" : 30 }
  13. }
  14. }
  15. }
  16. }
  17. }

全文搜索并将结果高亮显示,查找属性about中和“rock climbing”有关的所有文档信息,查询结果会根据字段_socre(相关性得分)来显示,得分越高越靠前:

  1. GET /megacorp/employee/_search
  2. {
  3. "query" : {
  4. "match" : {
  5. "about" : "rock climbing"
  6. }
  7. },
  8. "highlight": {
  9. "fields" : {
  10. "about" : {}
  11. }
  12. }
  13. }

聚合查询,类似于 MySQL 中的 group by,但是更强大,根据兴趣来聚合查询

  1. GET /megacorp/employee/_search
  2. {
  3. "aggs": {
  4. "all_interests": {
  5. "terms": { "field": "interests.keyword"}
  6. }
  7. }
  8. }

得到结果:
image.png

聚合复杂查询,所有 last_name 为 smith 的文档信息:

  1. GET /megacorp/employee/_search
  2. {
  3. "query": {
  4. "match": {
  5. "last_name": "smith"
  6. }
  7. },
  8. "aggs": {
  9. "all_interests": {
  10. "terms": {
  11. "field": "interests.keyword"
  12. }
  13. }
  14. }
  15. }

聚合复杂查询,根据兴趣类型,并返回该类型下所有的平均年龄:

  1. GET /megacorp/employee/_search
  2. {
  3. "aggs" : {
  4. "all_interests" : {
  5. "terms" : { "field" : "interests.keyword" },
  6. "aggs" : {
  7. "avg_age" : {
  8. "avg" : { "field" : "age" }
  9. }
  10. }
  11. }
  12. }
  13. }

term 查询包含关系,并不是完全相等

prefix 前缀匹配

wildcard 模糊匹配,提供*和?来匹配 keyword类型的文档

match 分词匹配,全文检索,适用于text,但实际很少用,因为匹配范围太广

match_phrase 短语匹配,查询前会将字符串解析为分词列表,然后保留那些包含分词列表的结果,适用于text;这个类型用的很多

multi_match 多组匹配,是对match的升级版本,适用于text

query_string ,支持非常丰富的查询,这个类型用的很多,适用于text

bool 组合匹配,支持多个条件组合查询,有这几种过滤选项:

  • must,所有的语句都必须匹配,与AND等价
  • must_not,所有的语句都不能匹配,与NOT等价
  • should,至少有一个语句要匹配,与OR等价
  • filter,必须匹配,运行在非评分和过滤模式

image.png

索引删除

DELETE http://localhost:9200/{索引名称}