ElasticSearch常用搜索命令整理(长期更新...)

  • 基础入门版
    • 快速检查集群的健康状况
    • 快速查看集群中有哪些索引
    • 索引的CRUD操作以商品为例
      • 新增商品建立索引
      • 查询商品参见查询专题详解
      • 修改商品name
      • 删除商品
  • 查询专题版
    • query string search不常用
    • query DSLDomain Specified Language特定领域的语言
    • query filter
    • full-text search全文检索
    • phrase search短语搜索
    • highlight search高亮搜索结果
  • 批量操作
    • 批量查询mget
    • 批量操作bulk

基础入门版

快速检查集群的健康状况

GET /_cat/health?v

说明:如何快速了解集群的健康状况?green、yellow、red?
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

快速查看集群中有哪些索引

GET /_cat/indices?v

索引的CRUD操作,以商品为例

新增商品(建立索引)

(1)手动指定document id(用于其他库倒进来时本身就含有id的情况)

PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" : "gaoxiao meibai",
    "price" : 30,
    "producer" : "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

说明:若已经有/ecommerce/product/1该数据,此时“新增”操作变成“全量替换”,旧数据被deleted。因此如果我们要需要创建,而不允许替换数据(逻辑:若已经有该条数据,则不进行任何操作(报错回滚))

(2)自动生成document id(自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突)

POST /ecommerce/product
{
    "name" : "gaolujie yagao",
    "desc" : "gaoxiao meibai",
    "price" : 30,
    "producer" : "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

查询商品(参见查询专题详解)

GET /ecommerce/product/1

修改商品name

全量替换:

PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao",
    "desc" : "gaoxiao meibai",
    "price" : 30,
    "producer" : "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}

部分修改:

POST /ecommerce/product/1/_update
{
  "doc": {
    "name": "jiaqiangban gaolujie yagao"
  }
}

删除商品

DELETE /ecommerce/product/1

说明:不会理解物理删除,只会将其标记为deleted,当数据越来越多的时候,在后台自动删除


查询专题版

query string search(不常用)

1、搜索全部商品:

GET /ecommerce/product/_search

查询结果部分字段说明:
took:耗费了几毫秒。
timed_out:是否超时,这里是没有。
_shards:数据拆成了5个分片,所以对于搜索请求,会打到所有的primary shard(或者是它的某个replica shard也可以)。
hits.total:查询结果的数量,3个document。
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高。
hits.hits:包含了匹配搜索的document的详细数据。

2、搜索商品名称中包含yagao的商品,而且按照售价降序排序

GET /ecommerce/product/_search?q=name:yagao&sort=price:desc

3、指定要查询出来商品的名称和价格

GET /ecommerce/product/_search?_source=name,price

query DSL(Domain Specified Language,特定领域的语言)

1、查询所有的商品(match_all)

GET /ecommerce/product/_search
{
  "query": { "match_all": {} }
}

2、查询名称包含yagao的商品,同时按照价格降序排序(sort)

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "name" : "yagao"
        }
    },
    "sort": [
        { "price": "desc" }
    ]
}

3、分页查询商品(from,size)
例如:总共3条商品,假设每页就显示1条商品,现在显示第2页,所以就查出来第2个商品

GET /ecommerce/product/_search
{
  "query": { "match_all": {} },
  "from": 1,
  "size": 1
}

4、指定要查询出来商品的名称和价格(source)

GET /ecommerce/product/_search
{
  "query": { "match_all": {} },
  "_source": ["name", "price"]
}

5、查询name和desc都含yagao的商品(multi_match)

GET /ecommerce/product/_search
{
  "query": {
    "multi_match": {
      "query": "yagao",
      "fields": ["name", "desc"]
    }
  }
}

6、查询价格大于等于30的商品(range)

GET /ecommerce/product/_search 
{
  "query": {
    "range": {
      "price": {
        "gte": 30
      }
    }
  }
}

7、查询name是yagao的商品(term 或者 terms数组指定多个)

GET /test_index/test_type/_search 
{
  "query": {
    "term": {
      "name ": "yagao"
    }
  }
}

说明:不常用。若想用term查询,则被查询的字段需要定义为不分词。

query filter

1、搜索商品名称包含yagao,而且售价大于25元的商品

GET /ecommerce/product/_search
{
    "query" : {
        "bool" : {
            "must" : {
                "match" : {
                    "name" : "yagao" 
                }
            },
            "filter" : {
                "range" : {
                    "price" : { "gt" : 25 } 
                }
            }
        }
    }
}

说明:bool 多条件查询,含以下参数:
must:返回的doc必须满足must子句的条件,并且参与计算score
must_not:返回的文档必须不满足must_not定义的条件
should:返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。
filter:返回的doc必须满足filter子句的条件,不参与计算sorce

full-text search(全文检索)

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "yagao producer"
        }
    }
}

phrase search(短语搜索)

跟全文检索相对应,相反,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。

phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回。

GET /ecommerce/product/_search
{
    "query" : {
        "match_phrase" : {
            "producer" : "yagao producer"
        }
    }
}

highlight search(高亮搜索结果)

GET /ecommerce/product/_search
{
    "query" : {
        "match" : {
            "producer" : "producer"
        }
    },
    "highlight": {
        "fields" : {
            "producer" : {}
        }
    }
}

批量操作

批量查询mget

获取商品id为1和2的商品信息(假设在同一个index和type下)

GET /_mget
{
   "docs" : [
      {
         "_index" : "ecommerce",
         "_type" : "product",
         "_id" : 1
      },
      {
         "_index" : "ecommerce",
         "_type" : "product",
         "_id" : 2
      }
   ]
}

或者

GET /ecommerce/_mget
{
   "docs" : [
      {
         "_type" : "product",
         "_id" : 1
      },
      {
         "_type" : "product",
         "_id" : 2
      }
   ]
}

或者

GET /ecommerce/product/_mget
{
   "ids": [1, 2]
}

批量操作bulk

需求:
1、删除id为1的商品
2、创建id为3的商品(name为“zhonghua yagao”)
3、修改商品2的name为“replaced zhonghua yagao”(采用全量替换的方式)
4、修改商品3的name为“bulk zhonghua yagao”(采用部分更新的方式)

POST /_bulk
{ "delete": { "_index": "ecommerce", "_type": "product", "_id": "1" }} 
{ "create": { "_index": "ecommerce", "_type": "product", "_id": "3" }}
{ "name": "zhonghua yagao" }
{ "index": { "_index": "ecommerce", "_type": "product", "_id": "2" }}
{ "name": "replaced zhonghua yagao" }
{ "update": { "_index": "ecommerce", "_type": "product", "_id": "3", "_retry_on_conflict" : 3} }
{ "doc" : {"name" : "bulk zhonghua yagao"} }

说明:
(1)delete:删除一个文档,只要1个json串就可以了
(2)create:PUT /index/type/id/_create,强制创建
(3)index:普通的put操作,可以是创建文档,也可以是全量替换文档
(4)update:执行的partial update操作

bulk api对json的语法,有严格的要求,每个json串不能换行,只能放一行,同时一个json串和一个json串之间,必须有一个换行

参考:ElasticSearch教程(龙果学院)

你可能感兴趣的:(elasticsearch)