应用层面
查询速度快
存储层面
1.以索引为基础文档形式落库
2.由于数据量大,索引同时开很多的话需要内存多,需要定期关闭不使用的索引(一般不直接删除,由于监管等要求,部分企业可能需要保留五年交易数据)
3.磁盘空间有限制,需要每年定期迁移数据,一般一年以上的索引建议直接迁移备份,只保留一年内的数据进行查询使用
使用层面
查询不如传统数据库方便,同样依赖于字段类型,新建索引的时候有mapping,就相当于表结构,mapping没定义的使用默认类型。
修改很麻烦,只能整体内容替换
删除同理,写语句很麻烦
常见的语句(命令关键字之类基础的,我就不说了,直接查es语句详解得了,我就出点常用的模板)
查询
确定mapping结构
GET /tian-abc-20250308/_mapping
根据字段查询:
{
"query":{
//match理解成模糊查询,term理解成精准查询
//"match":{
"term":{
"字段名":"要查的条件"
}
}
}
复杂查询:
场景:根据_id查询到的内容如下,如何使用_source根据S_0001的内容查询该文档
{ "hits":{ "total":1, "hits":[ { "_index":"tian-abc-20250308", "_type":"_doc", "_id":"202503080001" "_source":{ "requestParams":{ "S_0001":"hhh1", "S_0002":"hhh2" }, "reason":"1", "version":12 } } ] } }
这样的结果里,可以看到requestParams是我们常规理解的第一层,可以直接查询的内容,而他里面的内容如何查询,首先看requestParams的type是什么,常见的有object、nested、text、keyword、date等
如果 requestParams
是object类型:
适用场景
requestParams.S_0001 的值是精确值(如 "hhh1")。
如果 requestParams.S_0001 是 text 类型,Elasticsearch 会默认生成一个 keyword 子字段(requestParams.S_0001.keyword),用于精确匹配
POST /tian-abc-20250308/_search
{
"query": {
"term": {
"requestParams.S_0001.keyword": "hhh1"
}
}
}
--------------------------------------------------------
适用场景
requestParams.S_0001 的值是文本类型(text),并且需要分词匹配。
例如,如果值为 "hhh1 hhh2",查询 "hhh1" 会匹配成功。
POST /tian-abc-20250308/_search
{
"query": {
"match": {
"requestParams.S_0001": "hhh1"
}
}
}
如果 requestParams
是 nested
类型
POST /tian-abc-20250308/_search
{
"query": {
"nested": {
"path": "requestParams",
"query": {
"term": {
"requestParams.S_0001.keyword": "hhh1"
}
}
}
}
}
如果你的字段 设置成enabled:"false",更麻烦
如果 requestParams
字段的 enabled
属性被设置为 false
,Elasticsearch 不会对该字段进行索引或解析,因此无法直接通过 requestParams.S_0001
进行查询。不过,你仍然可以通过以下方法间接查询或提取 requestParams
中的数据(网上有好多种,比如直接查询所有的,跟咱们需求不符;还有直接用script的,我试了不好使,可能语句不对,我直接写我试过好用的)
GET /tian-abc-20250308/_search
{
"runtime_mappings": {
"S_0001_runtime": {
"type": "keyword",
"script": {
"source": "emit(params['_source']['requestParams']['S_0001'])" // 从 _source 中提取 S_0001
}
}
},
"query": {
"term": {
"S_0001_runtime": "hhh1" // 查询运行时字段
}
}
}
删除
一般是根据"_id"直接删除一条,需要指定索引名,太麻烦,懒得用,直接写好用的:根据查询条件直接删除索引,可以模糊匹配,但建议不要设置太宽的索引范围,(比如某个文档中没有上述的requestParams或者S_0001字段,都会报错)
//conflicts=proceed是忽略冲突项,比如删除正在修改的数据会报错,这个会忽略冲突
POST /索引名(可以用*进行模糊匹配)/_delete_by_query?conflicts=proceed
{
把刚刚写好的查询语句直接粘贴进来。。就这么简单
}
如
POST /tian-abc-2025*/_delete_by_query
{
"runtime_mappings": {
"S_0001_runtime": {
"type": "keyword",
"script": {
"source": "emit(params['_source']['requestParams']['S_0001'])" // 从 _source 中提取 S_0001
}
}
},
"query": {
"term": {
"S_0001_runtime": "hhh1" // 查询运行时字段
}
}
}
想记录的就这么多,结束课程