ElasticSearch常见避坑指南

一、查询要带上from-size

在es中query查询如果不指定from-size值,es默认from=0,size=10,默认一次查询10条数据

如下查询语句,11个唯一id查询,如果不指定from,size,只返回10条数据,而不是11条

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "id": [4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200]
          }
        }
      ]
    }
  },
  "sort": [
    {
      "created_time": {
        "order": "desc"
      }
    }
  ]
}

 所以正确的查询是加上from=0,size=11,即指定预期的size

二、查询要指定sort排序字段

在es中query查询如果不指定sort排序字段,翻页查询,可能会出现重复查询,分页混乱问题。

如下,每页查询10条,查询多页,可能会有重复的数据返回,此时查询要sort排序字段,尽可能的唯一,如创建时间或者主键、唯一ID字段等。

{
	"from": 0,
	"size": 10,
	"query": {
		"bool": {
			"must": [{
				"term": {
					"month": "2022-12"
				}
			}]
		}
	}
}

总体来说,这是由于 ES 的分片存储与分片检索机制导致的。一个常见的原因就是ES的_score评分引起的。ES默认的排序,恰恰就是按 _score倒序。 在全部doc的_score 都是0分的时候,分页就会错乱,有时候出现在第一页的结果很可能会重复出现在第二页,第三页 (取决于当时shards 返回的结果的顺序)

三、from-size分页设置窗口大小

如果初次使用且对es不熟悉的话,当from + size分页查询超过10000时候,会报如下异常:

Result window is too large, from + size must be less than or equal to: [10000] but was [22020]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting

上边 from+size=(pageNum-1)*size+size=(1101-1)*20+20=22020>10000,抛出了异常

当然10000也可以调整,如最大上限调整为800000

PUT my_index/_settings

{"index.max_result_window":"800000"}

之所以es默认设置最大查询量1w,与es的分布式存储和from+size的分页原理有关,可以参考之前的文章

四、should谨慎与must、filter等平级使用

在bool查询时候,should是选择性匹配,是or的关系。但是使用must、must_not、filter查询时候,bool下还带有与之平级的should条件,这时候should条件就失效了,满足不满足都可以。

如下查询,正常思维理解,在must下都符合条件的前提下,当should下的字段至少有一个以上符合条件时候,才会查询到数据,然而,实际并非如此,当should下字段都不符合条件时候也会查询到数据

{
  "from": 0,
  "size": 20,
  "query": {
    "bool": {
      "must": [
        {
          "term": {"order_id": { "value": 2133456244}}
        }
      ],
      "should": [
        {
          "term": {"creator": {"value": "zhangsanhh"}}
        },
        {
          "terms": {"dept_id_1": [8636,4460]
        }
        }
      ]
    }
  }
}

已知的有两种简单的方法可以避免此问题

(1)指定minimum_should_match

一种是在查询中增加minimum_should_match参数,指定值1,表示should下条件要至少满足一个条件的时候才返回数据

{
  "from": 0,
  "size": 20,
  "query": {
    "bool": {
      "must": [
        {
          "term": {"order_id": { "value": 2133456244}}
        }
      ],
      "should": [
        {
          "term": {"creator": {"value": "zhangsanhh"}}
        },
        {
          "terms": {"dept_id_1": [8636,4460]
        }
        }
      ],
       "minimum_should_match": 1,
    }
  }
}

(2)should降级

另一种把should单独包装为一个bool,降级到must下,把其整体作为must下的一个条件查询

{
	"from": 0,
	"size": 20,
	"query": {
		"bool": {
			"must": [{
					"term": {"order_id": {"value": 2133456244}}
				},
				{
					"term": {"sku_id": {"value": 1000342267312}}
				}, {
					"bool": {
						"should": [{
								"term": {"creator": {"value": "zhangsanhh"}}
							},
							{
								"terms": {"dept_id_1": [8636, 4460]}
							}
						]
					}
				}
			]
		}
	}
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是ElasticsearchElasticsearch是一个开源的分布式搜索和分析引擎,它可以快速地存储、搜索和分析大量的数据。 2. Elasticsearch的主要特点是什么? Elasticsearch的主要特点包括:分布式、高可用、实时搜索、全文搜索、多种查询方式、支持多种数据类型、可扩展性强等。 3. Elasticsearch数据结构是什么? Elasticsearch数据结构是基于文档的,每个文档都是一个JSON格式的数据对象,可以包含任意数量的字段。 4. Elasticsearch的索引是什么? Elasticsearch的索引是一个包含多个文档的数据集合,每个文档都有一个唯一的ID,可以通过ID来访问文档。 5. Elasticsearch查询方式有哪些? Elasticsearch查询方式包括:全文搜索、精确匹配、模糊匹配、范围查询、布尔查询、聚合查询等。 6. Elasticsearch的分布式架构是怎样的? Elasticsearch的分布式架构是基于节点的,每个节点都可以存储数据和执行查询,节点之间可以相互通信和协调工作,从而实现数据的分布式存储和查询。 7. Elasticsearch数据分片是什么? Elasticsearch数据分片是将一个索引分成多个部分,每个部分称为一个分片,每个分片可以存储一部分数据,从而实现数据的分布式存储和查询。 8. Elasticsearch数据备份是怎样的? Elasticsearch数据备份是通过副本实现的,每个分片可以有多个副本,副本可以分布在不同的节点上,从而实现数据的高可用和容错。 9. Elasticsearch的性能优化有哪些? Elasticsearch的性能优化包括:合理设置分片和副本、使用合适的查询方式、优化索引结构、使用缓存等。 10. Elasticsearch的安全性如何保障? Elasticsearch的安全性可以通过设置访问控制、加密通信、使用SSL证书等方式来保障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值