elasticsearch 常用搜索总结

match_all

它不包含任何条件,通常用于返回索引中的所有文档

GET /index/_search
{
    "query":{
        "match_all":{}
    }
}

match

用于执行全文本搜索。它可以对文本字段进行模糊匹配,支持分词器处理后的词项匹配

GET /index/_search
{
    "query":{
        "match":{
            "field_name":{
                "query":"search words", // 搜索匹配词
                "operator":"or",        // 控制多个词项之间的逻辑关系。可选值为 or(默认)和 and  
                "analyzer": "standard", // 指定在查询时使用的分析器。如果未指定,默认使用字段的映射定义中的分析器。
                "minimum_should_match": "50%" // 控制匹配的最小词项数量。可以是绝对数量或百分比。
            }
        }
    }
}

match_phrase

用于执行短语匹配查询。与普通的 match 查询不同,match_phrase 查询要求匹配的词项必须按指定的顺序出现,并且中间不能有其他词项。这使得 match_phrase 查询非常适合用于精确匹配短语

GET /index/_search
{
    "query":{
        "match_phrase":{
            "field_name":{
                "query":"search words", // 搜索匹配词
                "analyzer": "standard", // 指定在查询时使用的分析器。如果未指定,默认使用字段的映射定义中的分析器。
                "slop": 1               // 控制允许的词项之间的间隔。默认值为 0,表示词项必须紧挨着出现 (注:索引和搜索项使用不同的分词器可能会产生不同的词项,导致无法匹配)
            }
        }
    }
}

multi_match

查询可以在多个字段中进行搜索,返回包含匹配内容的文档

GET /index/_search
{
    "query":{
       "multi_match": {
            "query": "search words",         // 搜索匹配词
            "fields": ["field1", "field2"],  // 要搜索的字段列表
            "type": "best_fields"            // 匹配类型 可选值包括 best_fields(默认)、most_fields、cross_fields 和 phrase
        }
    }
    
}

best_fields:  默认类型。尝试在单个字段中找到最佳匹配。如果某个字段中的匹配度最高,则该字段的得分会被用作最终得分
most_fields:  尝试在多个字段中找到匹配,并将所有匹配字段的得分相加
cross_fields: 将所有字段视为一个整体进行匹配。适合字段之间有相似内容的情况
phrase:       要求匹配的词项按顺序出现,形成一个短语

term

用于精确查询,不进行分词处理,而是直接匹配字段中的完整值(包括大小写和空格)适用于 keyword 类型的字段

GET /index/_search
{
    "query":{
        "term": {
            "field_name": {
                "value":"search words" // 搜索匹配词
            }
        }
    }
}

注:

  1. 如果 term 匹配的字段为 text 类型,可以使用field_name.keyword 进行搜索
  2. term 处理多值字段(数组)时,查询是包含不是等于

terms

主要用于多值精确匹配,terms 查询在需要查找包含多个特定值的文档时非常有用,常用于过滤和聚合操作

GET /index/_search
{
    "query":{
        "terms": {
            "field_name": ["search word1","search word2"], // 多个搜索匹配词
             "minimum_should_match": 2                     // 指定至少需要匹配的值的数量或比例
        }
    }
}

terms_set

用于处理多值字段(如数组字段),并允许你根据字段中值的数量来动态地应用查询条件

GET /index/_search
{
  "query": {
    "terms_set": {
      "field_name": {
        "terms": [ "value1", "value2", ... ],
        "minimum_should_match": 1,                               // 固定的最小匹配值 整数或字符串(百分比)
        "minimum_should_match_field": "min_match_field",         // 指定一个字段,该字段的值将用作 minimum_should_match 的阈值
        "minimum_should_match_script": {
          "source": "params.num_terms * params.percent / 100"    // 使用脚本来动态计算 minimum_should_match 的值  params.num_terms: terms 列表中的值数量  params.percent: 可以在脚本中使用的百分比值
        }
      }
    }
  }
}

range

用于查找在指定范围内的文档的查询类型。它可以用于数值、日期、字符串等多种数据类型的字段

GET /index/_search
{
    "query":{
        "range": {
            "field_name":{
                "gte": 10,
                "lte": 20
            }
        }
    }
}

exists

查找包含特定字段的文档的查询类型。它不关心字段的具体值,只检查字段是否存在

GET /index/_search
{
    "query":{
        "exists": {
            "field":"field"
        }
    }
}

fuzzy

用于执行模糊搜索的查询类型。它允许用户在搜索时容忍一定的拼写错误,从而找到与查询词相似的文档

GET /index/_search
{
    "query":{
        "fuzzy": {
            "field_name":"search words"
        }
    }
}

bool query 组合搜索

用于组合多个查询条件,以实现复杂的搜索逻辑

GET /index/_search
{
  "query": {
    "bool": {
      "must": [ /* 必须满足的所有查询条件 */ ],
      "should": [ /* 至少满足一个的查询条件 */ ], (minimum_should_match 指定 should 条件中至少需要满足的条件数量)
      "must_not": [ /* 必须不满足的所有查询条件 */ ],
      "filter": [ /* 过滤条件,不影响评分 */ ]
    }
  }
}

聚合指标操作

聚合指标操作用于计算聚合结果中的各种统计指标,如求和、平均值、最大值、最小值等

GET /index/_search
{
    "size": 0, 
    "aggs":{
        "max_value":{
            "max":{
                "field":"field_name" // 聚合统计的字段
            }
        }
    }
}

# 单值分析
sum:计算字段的总和
avg:计算字段的平均值
min:计算字段的最小值
max:计算字段的最大值
value_count:计算总数
cardinality: 计算去重后总数
# 多值分析
stats:计算字段的统计信息
extended_stats:计算字段的扩展统计信息

桶聚合操作

桶聚合是一种将文档分组到不同的“桶”中的聚合操作。每个桶代表一组符合特定条件的文档。桶聚合可以嵌套其他聚合,以便对每个桶内的文档进行进一步的分析

常见的桶聚合类型:

  1. terms 聚合:根据字段值将文档分组到不同的桶中。
  2. range 聚合:根据数值范围将文档分组到不同的桶中。
  3. date_histogram 聚合:根据日期时间字段将文档分组到不同的时间区间桶中。
  4. histogram 聚合:根据数值字段将文档分组到不同的数值区间桶中。
  5. geo_distance 聚合:根据地理距离将文档分组到不同的距离区间桶中。
GET /index/_search
{
  "size": 0,
  "aggs": {
    "group_by_field": {
      "terms": {
        "field": "field_name", // 聚合字段名
        "size":10,             // 返回聚合数
        "order":{              // 排序默认desc
            "_count":"asc"
        }
      }
    }
  }
}
{
  "size": 0,
  "aggs": {
    "group_by_field": {
      "range": {
        "field": "field_name",
        "ranges": [
          { "to": 100 },
          { "from": 100, "to": 200 },
          { "from": 200 }
        ]
      }
    }
  }
}

top_hits 应用

top_hits(顶部命中)是一个聚合功能,用于在查询结果中返回每个桶中的顶部 N 个文档

GET /index/_search
{
    "size":0,
    "aggs":{
        "group_by_field":{
            "terms":{
                "field":"field_name",
                "size":10,
                "order":{
                    "_count":"desc"
                }
            },
             "aggs":{
                "hits_group_name": {
                    "top_hits": {
                        "size": 3,
                        "sort": [
                            { "field_name": { "order": "desc" } }
                        ],
                        "_source": ["field_name1", "field_name2","field_name3"]
                    }
                }
            }
        }
    }
}

管道聚合操作

管道聚合可以对已有的聚合结果进行进一步的计算和分析,从而生成新的聚合结果。常见的管道聚合类型包括 bucket_script、bucket_selector、derivative、moving_avg 等

常见的管道聚合类型:

  1. min_bucket: 从多个桶中找到某个指标的最小值
  2. max_bucket: 从多个桶中找到某个指标的最大值
  3. avg_bucket:计算多个桶中某个指标的平均值
  4. sum_bucket:计算多个桶中某个指标的总和
  5. stats_bucket:计算基本统计信息(如计数、最小值、最大值、总和、平均值)
  6. bucket_selector: 根据条件过滤桶
  7. bucket_script: 基于一个或多个桶的度量值执行脚本计算
GET /index/_search
{
    "size":0,
    "aggs":{
        "group_by_field":{
            "terms":{
                "field":"field_name"
            },
            "aggs":{
                "avg_field_name":{
                    "avg":{
                        "field":"field_name"
                    }
                }
            }
        },        
        "min_field_name":{
            "min_bucket":{
                "buckets_path":"group_by_field>avg_field_name"
            }
        }
        
    }
}

posted @ 2024-11-06 11:08  元気田支店长  阅读(62)  评论(0编辑  收藏  举报