强制段合并(force merge)
每个shard是基于多个segment组成创建的,segment的个数的减少可以大幅的提高查询的速度,定时的进行手动索引段合并,可以提高查询速度。支持单索引和多索引批量操作。
单索引示例:
curl -XPOST 'http://ip:httpport/myindex-001/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'
多索引安全模式下示例:
curl -XPOST 'http://ip:httpport/myindex-001,myindex-002/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'
curl -XPOST 'http://ip:httpport/_all/_forcemerge?only_expunge_deletes=false&max_num_segments=1&flush=true&pretty'
注释:
- max_num_segments:merge到多少个segments,1的意思是强行merge到1个segment;
- only_expunge_deletes:只清理有deleted标记的segments,推荐值false;
- flush:清理完执行一下flush,默认是true。
注意:
force merge操作是需要耗费大量的磁盘I/O,所以建议在业务比较空闲的时间进行后台强制段合并。
过滤查询(filter)
Elasticsearch的查询操作分为2种:查询(query)和过滤(filter),查询(query)默认会计算每个返回文档的得分,然后根据得分排序;而过滤(filter)只会筛选出符合的文档,并不计算得分,且可以缓存文档。
对于非全文检索的使用场景,如果不关心查询结果和查询条件的相关度,只是想查找目标数据,可以使用filter来提高查询效率。
query查询示例:
curl -XGET "http://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"age": "56"
}
}
}'
filter查询示例:
curl -XGET "http://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": {
"match": {
"age": "56"
}
}
}
}
}'
配置EsClient角色(协调节点)
EsClient角色可以用于发送查询请求到其他节点,收集和合并结果,以及响应发出查询的客户端。通过配置EsClient角色可以加快查询运算速度,提升缓存命中数。
避免使用wildcard模糊匹配查询
Elasticsearch默认支持通过*?正则表达式来做模糊匹配,数据量级别达到TB+甚至更高之后,模糊匹配查询通常会耗时比较长,甚至可能导致内存溢出,卡死乃至崩溃宕机的情况。所以数据量大的情况下,不要使用模糊匹配查询。
模糊匹配查询示例:
curl -XGET "http://ip:httpport/myindex-001/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"wildcard" : {
"name" : "*优"
}
}
}'
网友评论