ElasticSearch的查询、修改和删除

版权声明:原创,转载需告知 https://blog.csdn.net/qq_42136250/article/details/89600196

(一)新增

#指定id为1
PUT crm/user/1
{
“name”:“木村拓哉”,
“age”:22,
“hobby”:“冲浪”
}
#未指定id,自动生成(AWpcx3S8Io8IJp4iMrx_) 必须使用POST进行添加
POST crm/user/
{
“name”:“工藤静香”,
“age”:20,
“hobby”:“手绘”
}

#查询所有用户
GET search
#查询指定ID的文档
GET crm/user/AWpcx3S8Io8IJp4iMrx
?pretty
#查询指定ID的文档的指定字段内容
GET crm/user/1?_source=name,age
#查询文档内容,不要元数据
GET crm/user/1/_source

(二)修改

#全部更新,会覆盖以前的数据,未修改的数据会丢失,新字段会添加
PUT crm/user/1
{
“name”:“木村桑”,
“age”:18,
“wife”:“静香”,
“hobby”:“篮球”
}

#局部更新,不会覆盖数据,未修改的数据不会丢失
POST crm/user/1/_update
{
“doc”:{
“hobby”:“足球”
}
}

GET crm/user/1

(三)批量操作

#批量添加 有格式要求,不要随意添加回车换行
POST _bulk
{ “delete”:{ “_index”: “class”, “_type”: “student”, “_id”: “1” }}
{ “create”:{ “_index”: “class”, “_type”: “student”, “_id”: “1” }}
{ “title”: “小明” }
{ “index”: {"_index": “class”, “_type”: “student” }}
{ “title”: “小号” }
GET class/student/_search

#批量查询
#方式一
GET _mget
{
“docs”:[{
“_index”:“class”,
“_type”:“student”,
“_id”:“1”
},{
“_index”:“class”,
“_type”:“student”,
“_id”:“AWpc6KUoIo8IJp4iMryG”,
“_source”:“title”

}]

}

#方式二
GET itsource/blog/_mget
{
“ids”:[“1”,“AWpc6KUoIo8IJp4iMryG”]
}

(四)高级查询

#查询个数size为5,from从第一个开始查询
GET _search?size=10&from=1;
#查询age年龄为20的用户
GET crm/user/_search?q=age:20
#查询age年龄在10至30岁之间的用户
GET crm/user/_search?q=age[10 TO 30]

有大小写和格式要求,注意细节

(五)ES提供的DSL

由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言),
以JSON请求体的形式出现

查询字符串模式:

GET crm/user/_search?q=name:"木村拓哉"

DSL模式:

GET crm/user/_search
{
  "query" : {
   "match" : {
   		"name" : "木村拓哉"
    }
  }
}
  • 过滤查询
    ① 全匹配(match_all)
    普通搜索(匹配所有文档):
{
	"query" : {
	"match_all" : {}
	}
}

如果需要使用过滤条件(在所有文档中过滤,must部分默认可不写):

{
	"query" : {
		"bool" : {
			"must" : [{
				"match_all":{}
			}],
			"filter":{....}
		}
	}
}

② 标准查询(match和multi_match)
match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符:

{
	"query": {
		"match": {
			"fullName": "Steven King"
		}
	}	
}

上面的搜索会对Steven King分词,并找到包含Steven或King的文档,然后给出排序分值。
如果用 match 下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed的字符串时,它将为你搜索你给定的值,如:

{ "match": { "age": 26 }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "public": true }}
{ "match": { "tag": "full_text" }}

multi_match 查询允许你做 match查询的基础上同时搜索多个字段:

{
	"query":{
		"multi_match": {
			"query": "Steven King",
			"fields": [ "fullName", "title" ]
		}
	}
}

上面的搜索同时在fullName和title字段中匹配。
提示:match一般只用于全文字段的匹配与查询,一般不用于过滤。
③单词搜索与过滤(Term和Terms)

{
	"query": {
		"bool": {
			"must": { 
				"match_all": {} 
			}, 
			"filter": { 
				"term": { 
					"tags": "elasticsearch" 
				} 
			} 
		} 
	}
}

Terms搜索与过滤

{
	"query": {
		"terms": {
			"tags": ["jvm", "hadoop", "lucene"],
			"minimum_match": 2
		}
	}
}

minimum_match:至少匹配个数,默认为1

④ 组合条件搜索与过滤(Bool)
组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。
例如:查询爱好有美女,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人。

{
	"query": {
		"bool": {
			"must": [{"term": {"hobby": "美女"}}],
			"should": [{"term": {"hobby": "游戏"}}, 
							 {"term": {"hobby": "运动"}} 
							],
			"must_not": [
				{"range" :{"birth_date":{"lt": "1990-06-30"}}} 
			],
	        "filter": [...],
			"minimum_should_match": 1
		}
	}
}

提示: 如果 bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有 must子句,那么没有 should子句也可以进行查询。
⑤ 范围查询与过滤(range)
range过滤允许我们按照指定范围查找一批数据:

{
	"query":{
		"range": {
			"age": {
				"gte": 20,
				"lt": 30
			}
		}
	}
}

上例中查询年龄大于等于20并且小于30。
gt:> gte:>= lt:< lte:<=
⑥ 存在和缺失过滤器(exists和missing)

{
	"query": {
		"bool": {
			"must": [{
				"match_all": {}
			}],
			"filter": {
				"exists": { "field": "gps" }
			}
		}
	}
}

提示:exists和missing只能用于过滤结果。
⑦ 前匹配搜索与过滤(prefix)
和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’

{
	"query": {
		"prefix": {
			"fullName": "木村"
		}
	}
}

上例即查询姓木村的所有人。
⑧ 通配符搜索(wildcard)
使用*代表0~N个,使用?代表1个。

{
	"query": {
		"wildcard": {
			"fullName": "木村*"
		}
	}
}

完整的过滤查询实例

GET shop/goods/_search
{
  "query":{
    "bool": {
      "must": [
        {"match": {
          "name": "iphone"
        }}
      ],
      "filter": [{
        "term":{
          "local":"us"
        }
      },{
        "range":{
          "price":{
            "gte":"6000",
            "lte":"7000"
          }
        }
      }]
    }
  },
  "from": 1, 
  "size": 5,
  "_source": ["id", "name", "type","price"],
  "sort": [{"price": "desc"}]
}

猜你喜欢

转载自blog.csdn.net/qq_42136250/article/details/89600196