您的位置:

ES查询优化

一、使用查询条件缩小搜索范围

ES对搜索引擎的高效性得益于它采用的倒排索引数据结构。但是,在处理大规模的数据时,查询速度会变慢,因为查询会扫描整个索引。因此,使用查询条件缩小搜索范围可以在查询期间提高性能。

例如,如果您的应用程序只需要最近一天的数据,可以在查询时添加“日期”字段。通过这种方式,仅检查最近一天的数据,就可以缩小数据集的范围,加快查询速度。


GET /_search
{
    "query": {
        "bool": {
            "must": [
                {"match": {"title": "search"}},
                {"range": {"date": {"gte": "now-1d/d", "lt": "now/d"}}}
            ]
        }
    }
}

二、使用查询语句中的filter替代query

在查询语句中,“query”语句默认会根据查询条件积极评分筛选,即对命中的文档进行排序,使得相关性得分高的文档排在前面。

然而,当查询结果并不需要返回相关性得分时,应使用“filter”语句来替代“query”语句。这可以避免文档排序操作,从而加快搜索速度。filter语句只对命中的文档进行筛选,并返回结果,而不进行评分。


GET /_search
{
    "query": {
        "bool": {
            "filter": [
                {"match": {"title": "search"}},
                {"range": {"date": {"gte": "now-1d/d", "lt": "now/d"}}}
            ]
        }
    }
}

三、使用scroll API处理大量数据

当您从ES中检索大量数据时,由于需要在内存中缓存检索都返回的结果,搜索性能可能会受到影响。为了解决这个问题,ES提供了scroll API。

scroll API使用游标而不是从主节点中获取结果。当您一次性检索大量数据时,scroll API会用小批量数据替代所有数据,使得更快的访问,并减少内存的占用。


POST /logs/_search?scroll=1m
{
    "search_type": "query_then_fetch",
    "size": 1000,
    "query": {
        "match": {
            "response_code": 404
        }
    }
}

四、使用聚合操作检索数据

使用聚合操作可以检索ES中的数据,这些数据可能比普通查询数据更有用。聚合操作可用于生成类别统计、清单、相关性数据和数学摘要等。

聚合操作最常被用于数据分析、商业智能和数据挖掘领域。最常见的、最简单的聚合操作是计算平均值、最大值、最小值和总和。


GET /logs/_search
{
    "size": 0,
    "aggs": {
        "popular_items": {
            "terms": {
                "field": "url.keyword"
            },
            "aggs": {
                "num_requests": {
                    "sum": {
                        "field": "response_size"
                    }
                }
            }
        }
    }
}

五、使用短语匹配替代全文搜索

文本字段经常需要执行全文搜索,在这种情况下,使用更高效、更加特化的短语匹配查询能够提升搜索性能。使用短语匹配查询可以更好地控制哪些搜索字符串将被返回,从而提高搜索速度。

例如,在处理恶意软件、安全事件等大型日志数据时,使用短语匹配查询可确保返回与安全相关的结果,而不是所有包含匹配单词的结果。


GET /logs/_search
{
    "query": {
        "match_phrase": {
            "message": "kernel panic"
        }
    }
}