elasticsearch基本用法


写在前面

之前介绍过es基本概念 ElasticSearch学习文档-入门篇,本文将介绍es的基本用法

Index

PUT

# 创建索引
- PUT /索引名 ====> PUT /products
- 注意: 
 1.ES中索引健康转态  red(索引不可用) 、yellwo(索引可用,存在风险)、green(健康)
 
 2.默认ES在创建索引时回为索引创建1个备份索引和一个primary索引
		
# 创建索引, 进行索引分片配置
- PUT /product
{
  "settings": {
    "number_of_shards": 1, #指定主分片的数量
    "number_of_replicas": 0 #指定副本分片的数量
  }
}
{ 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }, 
  "mappings": {
    "properties": {
      "title":{
        "type": "keyword"
      },
      "price":{
        "type": "double"
      },
      "created_at":{
        "type": "date"
      },
      "description":{
        "type": "text"
      }
    }
  }
}

DELETE

# 删除索引
- DELETE /索引名 =====> DELETE /products
- DELETE /*     `*代表通配符,代表所有索引`

GET

GET /索引 // 查看某个索引

GET /索引/_mapping // 查看某个索引的映射

Document

PUT

POST /product/_doc/1 #指定文档id 
{
  "title":"iphone13",
  "price":8999.99,
  "created_at":"2021-09-15",
  "description":"iPhone 13屏幕采用6.1英寸OLED屏幕。"
}

POST /product/_doc #自动生成文档id
{
  "title":"iphone13",
  "price":8999.99,
  "created_at":"2021-09-15",
  "description":"iPhone 13屏幕采用6.1英寸OLED屏幕。"
}

GET

GET /product/_doc/1

DELETE

DELETE /product/_doc/1

POST

POST /product/_doc/1

说明: 这种方式可以将数据原始内容保存,并在此基础上更新。如果是PUT则是先删除原文档,再用新的数据创建

批量操作

POST /product/_doc/_bulk #批量索引两条文档
 	{"index":{"_id":"1"}}
  		{"title":"iphone14","price":8999.99,"created_at":"2021-09-15","description":"iPhone 13屏幕采用6.8英寸OLED屏幕"}
	{"index":{"_id":"2"}}
  		{"title":"iphone15","price":8999.99,"created_at":"2021-09-15","description":"iPhone 15屏幕采用10.8英寸OLED屏幕"}
POST /product/_doc/_bulk #更新文档同时删除文档
	{"update":{"_id":"1"}}
		{"doc":{"title":"iphone17"}}
	{"delete":{"_id":2}}
	{"index":{}}
		{"title":"iphone19","price":8999.99,"created_at":"2021-09-15","description":"iPhone 19屏幕采用61.8英寸OLED屏幕"}

说明:批量时不会因为一个失败而全部失败,而是继续执行后续操作,在返回时按照执行的状态返回!

高级查询

ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,Query DSL是利用Rest API传递JSON格式的请求体(Request Body)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。

# GET /索引名/_doc/_search {json格式请求体数据}
# GET /索引名/_search {json格式请求体数据}

查询所有

查询所有[match_all]
POST /product/_search
{
  "query": {
    "match_all": {}
  }
}

关键词查询(term)

POST /product/_search
{
 "query": {
   "term": {
     "title": {
       "value": "iphone13"
     }
   }
 }
}

NOTE1: 通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器对于英文单词分词,对于中文单字分词。

NOTE2: 通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词。

范围查询[range]

{
  "query": {
    "range": {
      "price": {
        "gte": 1400,
        "lte": 9999
      }
    }
  }
}

前缀查询[prefix]

{
  "query": {
    "prefix": {
      "title": {
        "value": "ipho"
      }
    }
  }
}

通配符查询[wildcard]

{
  "query": {
    "wildcard": {
      "description": {
        "value": "iphon*"
      }
    }
  }
}

多id查询[ids]

{
  "query": {
    "ids": {
      "values": [1]
    }
  }
}

upload successful

模糊查询[fuzzy]

{
  "query": {
    "fuzzy": {
      "description": "iphooone"
    }
  }
}

注意: fuzzy 模糊查询 最大模糊错误 必须在0-2之间

  • 搜索关键词长度为 2 不允许存在模糊
  • 搜索关键词长度为3-5 允许一次模糊
  • 搜索关键词长度大于5 允许最大2模糊

布尔查询[bool]

  • bool 关键字: 用来组合多个条件实现复杂查询
  • must: 相当于&& 同时成立
  • should: 相当于|| 成立一个就行
  • must_not: 相当于! 不能满足任何一个
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "title": {
            "value": "iphone13"
          }
        }}
      ]
    }
  }
}

多字段查询[multi_match]

{
  "query": {
    "multi_match": {
      "query": "iphone13",
      "fields": ["title","description"]
    }
  }
}

upload successful

注意: 字段类型分词,将查询条件分词之后进行查询改字段 如果该字段不分词就会将查询条件作为整体进行查询

默认字段分词查询[query_string]

{
  "query": {
    "query_string": {
      "default_field": "description",
      "query": "屏幕真的非常不错"
    }
  }
}

注意: 查询字段分词就将查询条件分词查询 查询字段不分词将查询条件不分词查询

高亮查询[highlight]

highlight 关键字: 可以让符合条件的文档中的关键词高亮

{
  "query": {
    "term": {
      "description": {
        "value": "iphone"
      }
    }
  },
  "highlight": {
    "fields": {
      "*":{}
    }
  }
}

自定义高亮html标签: 可以在highlight中使用pre_tags和post_tags

{
  "query": {
    "term": {
      "description": {
        "value": "iphone"
      }
    }
  },
  "highlight": {
    "post_tags": ["</span>"], 
    "pre_tags": ["<span style='color:red'>"],
    "fields": {
      "*":{}
    }
  }
}

多字段高亮 使用require_field_match开启多个字段高亮

{
  "query": {
    "term": {
      "description": {
        "value": "iphone"
      }
    }
  },
  "highlight": {
    "require_field_match": "false",
    "post_tags": ["</span>"], 
    "pre_tags": ["<span style='color:red'>"],
    "fields": {
      "*":{}
    }
  }
}

返回指定条数[size]

size 关键字: 指定查询结果中返回指定条数。 默认返回值10条

{
  "query": {
    "match_all": {}
  },
  "size": 1
}

分页查询[form]

from 关键字: 用来指定起始返回位置,和size关键字连用可实现分页效果

{
  "query": {
    "match_all": {}
  },
  "size": 1,
  "from": 1
}

指定字段排序[sort]

{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

返回指定字段[_source]

{
  "query": {
    "match_all": {}
  },
  "_source": ["title","description"]
}

参考

[1] ElasticSearch学习文档-入门篇

[2] ElasticSearch常见用法,看这一篇就够了

br>


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录