本章讨论搜索速度优化:搜索速度与系统资源、数据索引方式、查询方式等多方面
1、为文件系统cache预留足够的内存
1)应用程序一般情况下,读写都会被操作系统“cache”
2)cache保存在物理内存中,命中cache可以降低对磁盘的读写频率
3)搜索对系统cache很依赖,如果搜索从磁盘读取数据,则一定会产生相对较高的延迟
4)应该至少为系统cache预留一般的可用内存,更大内存可以有更高的cache命中率
5)线上应禁用swap
2、使用更快的硬件
1)写入对CPU更敏感、而搜索对IO能力需求更大,使用SSD会比旋转类介质好
2)尽量避免使用NFS等远程文件系统。如果NFS比本地系统慢3倍,则搜索场景响应速度会慢10倍
3)如果搜索类型属于计算型,则可以考虑更快的CPU
3、文档模型
1)文档应该合理建模,以降低搜索时的成本
2)避免join操作,嵌套(nested)回使查询慢几倍
3)父子关系可能使查询慢数百倍
4)如果可以通过非规范化文档来回答相同的问题,则可以显著的提高搜索速度
4、预索引数据
可以针对某些查询的模式来优化数据的索引方式
1)
5、字段映射
某些字段是数值类型,但是并不意味着总是应该被映射为数值类型,例如,
一些标识符将它们映射为keyword可能会比integer或long更好。
6、避免使用脚本
应避免使用脚本
如果一定要用,则应该优先考虑painless和expressions
7、优化日期搜索
8、只为读索引执行force-merge
1)为不再更新的只读索引执行force merge,将Lucene索引合并为单个分段,可以提升查询速度
2)如果Lucene索引存在多个分段,每个分段会单独执行搜索再将结果合并,将只读索引
强制合并为一个Lucene分段,不仅可以