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" // 搜索匹配词
}
}
}
}
注:
- 如果 term 匹配的字段为 text 类型,可以使用
field_name.keyword
进行搜索 - 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:计算字段的扩展统计信息
桶聚合操作
桶聚合是一种将文档分组到不同的“桶”中的聚合操作。每个桶代表一组符合特定条件的文档。桶聚合可以嵌套其他聚合,以便对每个桶内的文档进行进一步的分析
常见的桶聚合类型:
- terms 聚合:根据字段值将文档分组到不同的桶中。
- range 聚合:根据数值范围将文档分组到不同的桶中。
- date_histogram 聚合:根据日期时间字段将文档分组到不同的时间区间桶中。
- histogram 聚合:根据数值字段将文档分组到不同的数值区间桶中。
- 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 等
常见的管道聚合类型:
- min_bucket: 从多个桶中找到某个指标的最小值
- max_bucket: 从多个桶中找到某个指标的最大值
- avg_bucket:计算多个桶中某个指标的平均值
- sum_bucket:计算多个桶中某个指标的总和
- stats_bucket:计算基本统计信息(如计数、最小值、最大值、总和、平均值)
- bucket_selector: 根据条件过滤桶
- 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"
}
}
}
}