elasticsearch中查询进阶(分页,布尔,高亮,聚合),mapping,settings,ignore_above等设置

本文介绍Elasticsearch中的高级查询技巧,包括排序、分页、布尔查询等,并详细解析映射(mappings)的概念及应用,帮助读者更好地理解和使用Elasticsearch。

💮目录

进阶查询

sort排序

代码:

GET a1/doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

desc是降序排序,asc是升序

结果如下:
image-20210131212249663

注意,并不是所有的数据类型都能排序!!!!!!!**

分页查询

随着数据量的不端增大,查询结果也展示的越来越长,很多时候我们仅仅只是查询几条数据,不用全部显示出来。这个时候就要用到分页查询了。

只要指定的数据量

这个代码的意思是从第0个开始给2个

GET a1/doc/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,
  "size": 2
}

布尔查询

查询city为河北的

# 查询city是河北的
GET a1/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "河北"
          }
        }
      ]
    }
  }
}

结果:image-20210131220621232

must关键字–and

查询city是河北的and age为25

# 查询city是河北的and age为25
GET a1/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "河北"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

结果:

image-20210131220747733

should关键字–or

查询city是河北的 ,或者age为25

# 查询city是河北的 ,或者age为25
GET a1/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "city": "河北"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

结果:

image-20210131220914579

must_not关键字–not

查询city不是河北,age也不是18的

GET a1/doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "city": "河北"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}

结果:

image-20210131221012169

filter关键字–大于小于

查询city是河北和年龄大于18

# 查询city是河北, 年龄大于18
GET a1/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "河北"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 18 
          }
        }
      }
    }
  }
}

结果:

image-20210131221124859

查询city是河北和年龄大于等于18

# 查询city是河北,年龄大于等于18
GET a1/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "河北"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 18 
          }
        }
      }
    }
  }
}

结果:

image-20210131221243248

小结:

  • must:与关系,相当于关系型数据库中的and
  • should:或关系,相当于关系型数据库中的or
  • must_not:非关系,相当于关系型数据库中的not
  • filter:过滤条件。
  • range:条件筛选范围。
  • gt:大于,相当于关系型数据库中的>
  • gte:大于等于,相当于关系型数据库中的>=
  • lt:小于,相当于关系型数据库中的<
  • lte:小于等于,相当于关系型数据库中的<=

减少输出字段,结果过滤

当我们在获取数据的时候,不太希望所有的数据都展示出来就像select name from user的sql语句一样,可以单独将name字段提取出来,这样个操作的代码是加上_source字段进行筛选。

# 查询city是河北,年龄大于等于18, 查询出来得数据只要city
GET a1/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "city": "河北"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 18 
          }
        }
      }
    }
  },
  "_source": ["city"]
}

结果:

image-20210201094132711

高亮查询

当我们想在搜索关键字的时候加高亮显示,我们就可以使用高亮查询,假设我们这里想在描述中查询带有丽质词语的数据,并且加上高亮

GET a1/doc/_search
{
  "query": {
    "match": {
      "desc": "丽质"
    }
  },
  "_source": ["desc"],
  "highlight": {
    "fields": {
      "desc":{}
    }
  }
}

结果:

image-20210201095036313

都给套上了<em></em>标签

自己加样式

要是想自己设定样式可以这么做:

GET a1/doc/_search
{
  "query": {
    "match": {
      "desc": "丽质"
    }
  },
  "_source": ["desc"],
  "highlight": {
    "pre_tags": "<b style='color :grenn'>", 
    "post_tags": "</b>", 
    "fields": {
      "desc":{}
    }
  }
}


结果是:

### Elasticsearch 中 `ignore_above` 参数的功能与作用 `ignore_above` 是 Elasticsearch 中一个用于字段映射(mapping)的参数,主要用于控制字段值的长度限制。当字段值的字符数超过 `ignore_above` 指定的数值时,该字段值将不会被索引,但仍然会存储在文档中[^2]。这意味着虽然数据可以保存下来,但在查询时无法通过该字段进行检索。 #### 功能与作用 1. **长度限制** `ignore_above` 限制了字段值的最大长度。如果字段值的字符数超过了设定的阈值,则该字段值不会被索引。例如,对于 `keyword` 类型的字段,如果设置了 `"ignore_above": 256`,那么任何超过 256 个字符的值将不会被索引[^2]。 2. **节省存储空间和提升性能** 通过限制字段值的长度,可以避免过长的字段值对倒排索引造成不必要的负担,从而节省存储空间并提高查询性能。特别是对于日志、URL 或其他可能包含超长字符串的字段,这种限制非常有用。 3. **防止意外的数据膨胀** 在某些场景下,可能会有异常长的字段值进入索引。这些异常值不仅会占用大量存储空间,还可能导致查询性能下降。`ignore_above` 可以有效防止这种情况的发生。 #### 使用场景 1. **日志分析** 在日志分析场景中,某些字段(如 URL、用户输入等)可能包含超长字符串。通过设置 `ignore_above`,可以忽略这些超长字段值,避免对索引造成影响。 2. **URL 索引** 对于需要存储但不需要精确匹配的 URL 字段,可以通过设置 `ignore_above` 来限制索引长度。例如,如果 URL 超过 256 个字符,则只存储而不索引,确保查询效率。 3. **严格的数据管理** 在需要严格控制数据质量的场景中,`ignore_above` 可以作为数据校验的一部分,确保只有符合长度要求的字段值才会被索引。 #### 示例配置 以下是一个示例配置,展示了如何在 `keyword` 类型字段中使用 `ignore_above` 参数: ```json PUT my_index { "mappings": { "properties": { "url": { "type": "keyword", "ignore_above": 256 } } } } ``` 在此配置中,`url` 字段的值如果超过 256 个字符,则不会被索引,但仍然会存储在文档中。 ### 注意事项 - 如果字段值未被索引,则无法通过该字段进行精确匹配或全文搜索。 - 设置 `ignore_above` 时需要根据实际业务需求权衡字段长度与查询需求。 - 在动态映射中,`ignore_above` 可以通过 `dynamic_templates` 进行全局配置[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值