ElasticSearch设计原则(不定期补充)

ElasticSearch是个非常高效的开源搜索引擎,虽然产品本身已为极致搜索性能做了大量的默认设置,但在使用过程中还是有需要注意的地方,不然一个会有一些困扰以及对产品的误解。本篇就整理下使用ElasticSearch时需要考虑的点(不定期补充)。

1.任何查询都不要返回超过1000 个结果,即不要深度分页。

ElasticSearch会将数据分片存储,一个请求经常跨越多个分片,每个分片都产生自己的排序结果,这些结果需要进行集中排序以保证整体顺序是正确的。

我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。

现在假设我们请求第 1000 页–结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。

2.索引(保存)数据前,先设计好该数据域的映射(mapping)

在ElasticSearch中,数据以“_index/_type”这样的层级存储,相当于关系型数据库的“schema/table”。

在首次索引数据时,若没有自定义域映射,ES会自动为数据创建一个_type各个域的映射关系(mapping)。可以使用“GET /(指定的_index)/_mapping/(指定的_type)”查看某个_type的映射关系。

虽然ES可以再增加新的域映射,但不能修改已存在的域映射。想要修改已存在的域映射,必须先删除所有数据,再自定义域映射,最后把数据索引才能达到修改的效果。这个流程对生产系统的冲击非常大,所以要尽量避免这样的情况,在一开始就设计到域映射关系。

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注