ElasticSearch笔记-增删改查

添加文档:

添加单个文档

http://139.155.44.138:9200/index1/user/1000 POST			
{
"id":1001,
"name":"张三",
"age":20,
"sex":"男"
}

如果不指定id,将随机生成一个,id的字段名是_id

批量添加文档

POST index6/user/_bulk
{"create":{"_index":"index6","_type":"user","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"index6","_type":"user","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"index6","_type":"user","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}

最后一行一定要回车

删除文档:

删除指定id的文档

http://localhost:9200/blog/article2/1 DELETE

按条件删除

POST index5/people/_delete_by_query?q=name:zhangsan

修改文档

覆盖文档:

ES中文档数据不能修改,可以通过覆盖的方式进行更新。所以和上面的操作相同

http://139.155.44.138:9200/index1/user/1001 POST
{
"id":1001,
"name":"张三",
"age":20,
"sex":"男"
}

修改字段:

上面操作时更新整个文档,可以操作局部更新,但是实际上es内部帮我们查询这个文档,然后修改、覆盖整个文档

http://139.155.44.138:9200/index1/user/1001/_update	 POST
{
"doc":
      {
            "age":2000
      }
}

批量操作文档

语法

{ action: { metadata }}
{ requestbody}
{ action: { metadata }}
{ requestbody}

批量添加

POST index6/user/_bulk
{"create":{"_index":"index6","_type":"user","_id":2001}}
{"id":2001,"name":"name1","age": 20,"sex": "男"}
{"create":{"_index":"index6","_type":"user","_id":2002}}
{"id":2002,"name":"name2","age": 20,"sex": "男"}
{"create":{"_index":"index6","_type":"user","_id":2003}}
{"id":2003,"name":"name3","age": 20,"sex": "男"}

批量删除

POST index6/user/_bulk
{"delete":{"_index":"index6","_type":"user","_id":2001}}
{"delete":{"_index":"index6","_type":"user","_id":2002}}
{"delete":{"_index":"index6","_type":"user","_id":2003}}

文档是否存在

HEAD index6/user/2008

查询

查询有两种方式:
简单查询:通过query参数传递查询语句(?q=name:zhangsan)
DSL查询:通过DSL语句查询,可以写出灵活复杂的查询语句,语言以json请求体的形式出现

使用id查询

http://139.155.44.138:9200/index1/user/1001 GET

全部(默认返回10条数据)

http://139.155.44.138:9200/index1/user/_search GET

按条件查询

http://139.155.44.138:9200/index1/user/_search?q=name:233	GET

term查询:

term主要用来精确匹配值,比如数字、日期、bool、未分词的字符串

http://139.155.44.138:9200/index1/_search POST
{
	"query":{
		"term":{
			"age":18
		}
	}
}

terms查询:

terms和term类似,但允许指定多个匹配条件。如果字段指定了多个值,那么文档需要一起去做匹配
http://139.155.44.138:9200/index1/_search POST

{
	"query":{
		"terms":{
			"age":[18,38]
		}
	}
}

range查询:

按指定范围查找数据

http://139.155.44.138:9200/index1/_search POST
{
	"query":{
		"range":{
			"age":
			{
				"gte":18,
				"lt":50
			}
		}
	}
}

exists查询:

用于查找文档中是否包含指定字段或没有某个字段,类似sql中的IS_NULL

http://139.155.44.138:9200/index1/_search POST
{
	"query":{
		"exists":{
			"field":"name"
		}
	}
}

排序

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ]
}

分页

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_id": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 2
}

bool查询:

bool查询可以用来合并多个条件查询结果的布尔逻辑.
关键词:

关键词 描述
must 必须满足的条件,而且会计算分数
filter 必须满足的条件,不会计算分数
should 可以满足的条件,会计算分数
must_not 必须不满足的条件,不会计算分数

它包含操作符:must相当于and、must_not相当于not、should相当于or

http://139.155.44.138:9200/index1/_search POST
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tag" : "wow" } },
        { "term" : { "tag" : "elasticsearch" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

过滤查询?

做精确搜索时,最好用过滤语句,因为过滤语句可以缓存数据

match查询:

Full Text Search会对检索文本作分词处理, 然后从倒排索引中作匹配查询, 如果一个文档的对应field中存在任意一个分解后的词, 那么这个文档就算匹配检索条件.

http://139.155.44.138:9200/index1/_search POST
{
	"query":{
		"match":{
			"name":"张三 aaa"
		}
	}
}

match_phrase

Phrase Search不会对检索串进行分词处理, 只有一个文档的对应field中包含与检索文本完全一致的内容, 该文档才算匹配检索条件, 也才能作为结果返回 —— 可以理解为全文检索场景下的部分精确匹配.

GET meshop-track-2020.12.01/_search
{
  "query": {
    "match_phrase": {
      "domain_userid": "e7c885a0-169f-4ae7-94c8-bd38ceee0cde"
    }
  }
}

高亮显示:

http://139.155.44.138:9200/index1/_search POST
{
	"query":{
		"match":{
			"name":"wangwu zhaoliu"
		}
	},
	"highlight": {
		"fields": {
			"name": {}      
		}    
	}
}

结果过滤

相当于SELECT子句,返回部分字段
简单查询:index1/_search?_source=id,name
DSL查询:

GET index5/people/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name","age"]
}

排重查询:

POST meshop-track-2020.12.05/track/_search

{
  "size":0,
  "query": 
  {
     "bool":
     {
            "must":
            [
                {"term":{"page_urlhost":"www.berniam.com"}},
                {"term":{"event_name":"page_view"}}
            ]
      }
  },
  "aggs": {
    "uid_aggs": {
      "cardinality": {
        "field": "doc_width"
      }
    }
  }    
}

search参数列表

参数 使用方法
q 查询字符串,案例:q=-field1:test #查找不满足条件的所有文档
from 从所有返回结果中的第几条开始显示, 默认为0.
size 搜索结果返回的条数. 默认为10, 即返回前10条.
df 查询中没有定义前缀时, 默认的搜索字段
analyzer 分析查询字符串所使用的分析器的名称
lowercase_expanded_terms 搜索时忽略大小写标识, 默认为true
analyze_wildcard 通配符或前缀查询是否被分析, 默认为false
batched_reduce_size 协调节点需要减少的分片结果数. 当分片数量很多时, 会产生很大的内存开销, 这个参数用来当做保护机制
default_operator 默认的多个条件之间的关系, 可以是 AND 或 OR. 默认是 OR.
lenient 如果设置为true, 字段类型转换失败时将忽略处理. 默认为false.
explain 在每个返回结果中, 将包含评分机制的详细计算描述.
_source 是否包含元数据, 同时支持_source_incude和_source_exclude.
stored_fields 选择查询到的文档的指定字段, 多个之间用","分隔. 若不指定任何字段, 就不会返回任何字段.
sort 根据字段名排序. 可以是fieldName, 或fieldName:desc, 或fieldName:asc, 或_score (给予分数的排序). 可以有多个排序参数, 要注意各参数之间的顺序.
timeout 搜索超时, 在指定的时间内执行搜索请求, 并在超时时间到期时返回查询到的已有结果. 默认无超时.
track_scores 跟踪评分. 排序时, 设置为true后将跟踪评分情况, 并在返回的结果中携带评分信息.
track_total_hits 设置为false, 禁止跟踪每个查询的结果总数. 默认为true, 即统计搜索到的结果总数.
terminate_after 每个分片搜索的最大文档数, 如果达到此值, 即使搜索尚未结束, 当前分片将提前终止搜索. 如果设置, 响应信息中将携带一个boolean类型的terminated_early字段, 表示查询提前终止了. 默认没有设置.
search_type 搜索的类型, 可以是dfs_query_then_fetch或query_then_fetch, 默认是query_then_fetch.
allow_partial_search_results 如果请求将产生部分结果, 设置为false用来返回整体故障. 默认为true,这将在超时或部分失败的情况下, 返回部分结果. 可以通过集群中的search.default_allow_partial_results来设置此参数

查询多索引数据

# 同时搜索两个index下的数据
GET index1,index2/_search
# 按照通配符匹配搜索多个index下的数据
GET *1,*2/_search 

timeout超时机制

指定每个Shard必须在规定的时间内将搜索到的数据 (可能只搜索到了部分数据, 也可能搜索到了全部数据) 立即返回给客户端, 而不是等待查询操作完全完成后再返回
ES的搜索默认不开启timeout, 可以手动指定timeout

GET _search?timeout=10ms
# 可用的单位: timeout=10ms | timeout=1s | timeout=1m

查询响应信息说明

{
    "took" : 346,          // 整个检索消耗的时间, 单位是毫秒. 包括线程池中的等待时间、集群中分布式搜索+收集结果的时间
    "timed_out" : false,   // 默认不启用超时机制, 若启用, 需要设置具体的时间值
    "_shards" : {          // 搜索用到的shard数, 以及成功/失败的shard数
        "total" : 5,
        "failed" : 0       // 一个Shard的Primary和Replicas都挂掉, 它才被认为失败
    },
    "hits" : {
        "total" : 10,      // 本次搜索命中(搜索到)的结果总数
        "max_score" : 1.0, // 本次搜索的所有结果中, 最大的相关度分数
        "hits" : [         // 默认显示查询结果中的前10条记录, 根据_score降序排序
            {
                "_index" : "book_shop",
                "_type" : "books",
                "_id" : "2",
                "_score" : 1.0,  // 相关度得分, 越相关, 分值越大, 排位越靠前
                "_source" : {
                }
            } 
        ]
    }
}

参考:
https://www.cnblogs.com/shoufeng/p/10782328.html

原文地址:https://www.cnblogs.com/fanfan-90/p/14198376.html