我运行了一个elasticsearch (7.10)集群,它主要用于在文本文档上进行搜索。我正在使用的索引不需要经常更新,在索引时间内对速度也没有很大的要求。这个系统的性能确实需要搜索时间。文档的数量可能总是在5,000-7,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000存储大小的存储大小,一旦它所有的构建。
我关心的索引和字段的映射如下所示:
"mappings": {
"properties": {
"document_text": {
"type": "text"
}
}
}document_text是一个文本字符串,长度在50-500个单词之间。发送到此索引的典型查询是在boolean should查询中链接在一起的match查询。通常,子句的数量在5-15个之间。
我遇到的问题是,对索引的搜索查询的初始延迟非常高,通常在4-6秒的范围内,但是在第一次搜索之后,文档被缓存,因此延迟变得更低,<1秒。该集群有3个数据节点、3个主节点和2个摄取/客户端节点,并由fast SSD提供支持。我注意到数据节点上的堆并没有真正承受太大的压力,RAM也没有,这让我意识到文档并没有按照我想要的方式预先缓存。根据我所做的研究,我选择了让fielddata=true在索引时获取内存中的字段数据对象,而不是在搜索时构造该对象。我知道这会增加JVM堆的压力,所以我可能会做一些频率过滤,只将某些文档放在内存中。我遇到的另一个选择是设置eager_global_ordinals=true,这在某种程度上类似于启用fielddata,因为它也会在索引时在内存中构建映射。我对ES还是个新手,两者之间的术语对我来说有点混乱。我想知道的是两者之间的区别是什么,并且确实使它们中的一个或两个看起来是合理的,以解决我的延迟问题,或者我完全误解了文档。谢谢!
发布于 2021-01-25 16:48:20
启用eager_global_ordinals不会对您的查询产生任何影响。启用全局序号只对聚合有帮助,doc values将在索引刷新时加载,而不是在查询时加载。
启用fielddata也不会对您的查询产生任何实际影响。它的主要用途是排序和聚合,而您实际上并不想在text字段上执行这些操作。
在first ES查询速度较慢的情况下,您可能无法做太多事情。更好地关注最优索引映射、设置、分片和文档大小。
https://stackoverflow.com/questions/65875695
复制相似问题