您的位置:首页 > 其它

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

2018-02-17 23:33 483 查看
基础入门版
快速检查集群的健康状况

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

索引的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教程(龙果学院)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息