es的语法操作命令

Posted 小徐敲java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es的语法操作命令相关的知识,希望对你有一定的参考价值。

查询


#查询索引
GET person

#查询全部索引的状态数据
GET /_cat/indices?v

#查询
GET http://ip:端口/索引名称  # 查询单个索引信息
GET http://ip:端口/索引名称1,索引名称2...  # 查询多个索引信息
GET http://ip:端口/_all  # 查询所有索引信息

#查询映射
GET person1/_mapping

#查询文档,指定id
GET /person/_doc/1

#查询所有文档
GET /person/_search

添加

#添加
PUT http://ip:端口/索引名称
#创建索引并添加映射(推荐)
PUT /person1

  "mappings": 
    "properties": 
      "name": 
        "type": "text"
      ,
      "age": 
        "type": "integer"
      
    
  


#添加字段
PUT /person1/_mapping

  "properties": 
    "name": 
      "type": "text"
    ,
    "age": 
      "type": "integer"
    
  


#添加文档,指定id
POST /person/_doc/1

  "name":"张三",
  "age":18,
  "address":"北京"


#添加文档,不指定id
POST /person1/_doc/

  "name":"张三",
  "age":18,
  "address":"北京"


#字段"tel"不可以进行查询,不然会报错只因创建映射时"tel""index"false

    "user": 
        "mappings": 
            "properties": 
                "name": 
                    "type": "text"
                ,
                "sex": 
                    "type": "keyword"
                ,
                "tel": 
                    "type": "keyword",
                    "index": false
                
            
        
    




修改

#局部更新
POST /user/_update/4

  "doc": 
    "email":"88886"
  


#全量更新,存在就更新,不存在就创建
POST /user/_doc/4

   "name" : "王九",
   "sex" : "男性",
   "tel" : "99"



删除

#删除索引
DELETE http://ip:端口/索引名称

#删除指定id文档
DELETE /person/_doc/1

#删除某个文档中的属性
POST user/_doc/1/_update

    "script" : "ctx._source.remove('new_field')"


高级ur路径查询

#查询name端包含王或者九的
GET /user/_search?q=name:王九

#URL带参数形式查询,这很容易让不善者心怀恶意,或者参数值出现中文会出现乱码情况。为了避免这些情况,我们可用使用带JSON请求体请求进行查询

高级查询term

#term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解
GET user/_search

  "query": 
    "term": 
      "FIELD": 
        "value": "VALUE"
      
    
  



#terms里的[ ] 多个是或者的关系,只要满足其中一个词就可以
GET user/_search

  "query": 
    "terms": 
      "FIELD": [
        "VALUE1",
        "VALUE2"
      ]
    
  


#terms里的[ ] 多个是或者的关系,只要满足其中一个词就可以。想要通知满足两个词的话,就得使用boolmust来做
GET user/_search

  "query": 
    "bool": 
      "must": [
        "term": 
          "FIELD": 
            "value": "VALUE"
          
        ,
        
          "term": 
            "FIELD": 
              "value": "VALUE"
            
          
        
      ]
    
  


高级查询match

#查找所有文档内容
GET user/_search

	"query":
		"match_all":
	



# 查询全部文档指定字段
GET user/_search

	"query":
		"match_all":
	,
	"_source":["FIELD"]






#match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配
GET user/_search

  "query": 
    "match": 
      "FIELD": "TEXT"
    
  


#match_phrase 称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致
GET user/_search

"query": 
  "match_phrase": 
    "FIELD": "PHRASE"
  



# 上面的 MatchQuery 有一个短板,假如用户输入了某关键字,我们在查找的时候并不知道他输入的是 name 还是 description,这时我们用什么都不合适,而 MultiQuery 的出现解决了这个问题,他可以通过 fields 属性来设置多个域联合查找
GET user/_search

    "query": 
        "multi_match": 
            "query": "Spring开发",
            "minimum_should_match": "70%",
            "fields": ["name", "description"]
        
    


范围查询


多条件查询,must相当于数据库的&&,should相当于数据库的||

#must相当于数据库的&&
GET user/_search

	"query":
		"bool":
			"must":[
				"match":
					"name":"小王"
				
			,
				"match":
					"age":18
				
			]
		
	



#should相当于数据库的||
GET user/_search

	"query":
		"bool":
			"should":[
				"match":
					"name":"小王"
				
			,
				"match":
					"age":18
				
			]
		
	


分页查询

GET user/_search

	"query":
		"match_all":
	,
	"from":0,
	"size":2


查询排序


	"query":
		"match_all":
	,
	"sort": [
    
      "age": 
        "order": "desc"
      
    
  ]


范围查询

GET user/_search

	"query":
		"bool":
			"should":[
				"match":
					"name":"小王"
				
			,
				"match":
					"age":18
				
			],
			"filter": [
			  "range": 
			    "age": 
			      "gte": 10,
			      "lte": 20
			    
			  
			]
		
	

全文检索


	"query":
		"match":
			"name" : "王妹"
		
	


高亮查询,高亮展示的数据,本身就是文档中的一个field,单独将field以highlight的形式返回给你。

ES提供了一个highlight属性,和query同级别的

GET user/_search

  "query": 
    "match_phrase": 
      "name": "张三"
    
  ,
  "highlight": 
    "fields": 
      "name": 
    ,
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fragment_size": 10
  
    

fragment_size :指定高亮数据展示多少个字符回来;
pre_tag:指定前缀标签,如 < font color=“red”>
post_tags:指定后缀标签,如 < /font>
field:指定那个字段为高亮字段

分组查询

GET user/_search

  "aggs": 
    "gg_gl": 
      "terms": 
        "field": "age"
      
    
  ,
  "size": 0

高级映射嵌套**【字段type设置为keyword就不会被分词】

#嵌套节点下面新增字段
PUT /user/_mapping


    "properties": 
        "school": 
            "type": "keyword",
            "norms": false,
            "doc_values": false
        ,
        "teacher": 
            "type": "nested",
            "properties": 
                "rightStatus": 
                    "type": "keyword",
                    "norms": false,
                    "doc_values": false
                ,
                "rightCurrTime": 
                    "type": "keyword",
                    "norms": false,
                    "doc_values": false
                
            
        
    

#关闭、打开索引(关闭索引是为了释放内存,将数据持久化到硬盘,不可读写已经关闭的索引)

POST http://ip:端口/索引名称/_close  

POST http://ip:端口/索引名称/_open ```

IK分词器有两种分词模式:ik_max_word和ik_smart模式

linux系统安装分词器,首先docker安装es

进入到es

docker exec -it elasticsearch /bin/bash

执行安装ik分词器(注意安装的分词器需要与es版本一直,不一致更改一下ik分词器的版本号)

./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip

安装成功后,可以再宿主机es挂卷的plugin下看到ik文件,然后必定要重启es容器

docker restart elasticsearch 

在kibana上操作,查看分词器结果**【注意如是是英文字母大写,使用默认分词器分词后都会变成小写】

GET /_analyze

  "analyzer": "ik_smart",
  "text": "东哥是前端大佬"



#结果

  "tokens" : [
    
      "token" : "东",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    ,
    
      "token" : "哥",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    ,
    
      "token" : "是",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 2
    ,
    
      "token" : "前端",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 3
    ,
    
      "token" : "大佬",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    
  ]

ES数据类型

聚合:相当于mysql 中的sum(求和)
text:会分词,不支持聚合
keyword:不会分词,将全部内容作为一个词条,支持聚合
integer:数值类型
boolean:布尔
binary:二进制
integer_range, float_range, long_range, double_range, date_range :范围类型
date:日期
[ ] Nested: nested (for arrays of JSON objects 数组类型的JSON对象):数组
Object: object(for single JSON objects 单个JSON对象):对象

GET:用来获取资源
POST:用来新建资源(也可以用于更新资源)
PUT:用来更新资源
DELETE:用来删除资源

  • ES 5.x中一个index可以有多种type。
  • ES 6.x中一个index只能有一种type。
  • ES 7.x以后,将逐步移除type这个概念,现在的操作已经不再使用,默认_doc
    #查看索引下的字段映射,es版本为7的可使用一下命令,在mapping?后加上format=json&include_type_name=true
    GET /user/_doc/_mapping?format=json&include_type_name=true

以上是关于es的语法操作命令的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch_01_ES的引入

ElasticSearch_01_ES的引入

ElasticSearch_01_ES的引入

ElasticSearch由浅入深

ElasticSearch由浅入深

elasticsearch部分命令