ElasticSearch-DSL

2024-09-05 17:04
文章标签 elasticsearch dsl

本文主要是介绍ElasticSearch-DSL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 查询所有 match_all
    • 分页查询 from + size
    • 深分页查询 Scroll
    • 指定字段排序 sort
    • 返回指定字段_source
    • match
  • 短语查询 match_phrase
  • 多字段查询 multi_match
  • query_string
    • simple_query_string
  • 关键词查询 Term
    • 结构化搜索
  • 前缀查询 prefix
  • 通配符查询 wildcard
  • 范围查询 range
  • 多 id 查询 ids
  • 模糊查询 fuzzy
  • 高亮 highlight

  • Query DSL(Domain Specified Language)是利用Rest API传递JSON格式的请求体(RequestBody)与ES进行交互

查询所有 match_all

  • 使用match_all,默认只会返回10条数据
    • _search查询默认采用的是分页查询,每页记录数size的默认值为10
    • 如果想显示更多数据,指定size
GET /es_db/_search
# 等同于
GET /es_db/_search 
{"query":{"match_all":{}}}

分页查询 from + size

  • 返回指定条数size
    • size 关键字: 指定查询结果中返回指定条数。 默认返回值10条
    • from + size的结果必须小于或等于10000
    • 可以采用scroll api更高效的请求大量数据集
GET /es_db/_search 
{"query":{"match_all":{}},"size": 100}
  • 查询结果的窗口的限制可以通过参数index.max_result_window进行设置
    • index.max_result_window主要用来限制单次查询满足查询条件的结果窗口的
      • 不能简单理解成查询返回给调用方的数据量
      • 窗口大小由from + size共同决定
    • 主要是为了限制内存的消耗
      • 尽管最后我们只取了10条数据返回给客户端,但ES进程执行查询操作的过程中确需要将(1000000 + 10)的记录都加载到内存中
      • 这也是ES中不推荐采用(from + size)方式进行深度分页的原因
PUT /es_db/_settings
{"index.max_result_window":"20000"}
# 修改所有的索引
PUT /_all/_settings
{"index.max_result_window":"20000"}
  • 分页查询 form
    • from 关键字: 用来指定起始返回位置,和size关键字连用可实现分页效果
GET /es_db/_search 
{"query":{"match_all":{}},"size":5,"from":0}

深分页查询 Scroll

  • 查询命令中新增 scroll=1m,说明采用游标查询,保持游标查询窗口一分钟
GET /es_db/_search?scroll=1m
{"query":{"match_all":{}},"size":2}
  • 采用游标id查询
    • 多次根据scroll_id游标查询,直到没有数据返回则结束查询
    • 采用游标查询索引全量数据,更安全高效,限制了单次对内存的消耗
GET /_search/scroll
{"scroll":"1m","scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFmNwcVdjblRxUzVhZXlicG9HeU02bWcAAAAAAABmzRY2YlV3Z0o5VVNTdWJobkE5Z3MtXzJB"}

指定字段排序 sort

  • 会让得分失效
GET /es_db/_search
{"query":{"match_all":{}},"sort":[{"age":"desc"}]}

返回指定字段_source

  • _source 关键字: 是一个数组,在数组中用来指定展示那些字段
GET /es_db/_search
{"query":{"match_all":{}},"_source":["name","address"]}

match

  • match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找
    • query : 指定匹配的值
    • operator : 匹配条件类型
      • and : 条件分词后都要匹配
      • or : 条件分词后有一个匹配即可 (默认)
    • minmum_should_match : 最低匹配度,即条件在倒排索引中最低的匹配度
# 模糊匹配 match 分词后 or 的效果
GET /es_db/_search
{"query":{"match":{"address":"广州白云山公园"}}}
# 分词后 and 的效果
GET /es_db/_search 
{"query":{"match":{"address":{"query":"广州白云山公园","operator":"AND"}}}}
  • 当operator参数设置为or时,minnum_should_match参数用来控制匹配的分词的最少数量
# 最少匹配 广州,公园 两个词
GET /es_db/_search
{"query":{"match":{"address":{"query":"广州公园","minimum_should_match":2}}}}

短语查询 match_phrase

  • match_phrase 查询分析文本并根据分析的文本创建一个短语查询
  • match_phrase 会将检索关键词分词
  • match_phrase 的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的
GET /es_db/_search
{"query":{"match_phrase":{"address":"广州白云山"}}}
  • address 改成”广州白云“可能查不出数据
    • 广州和白云不是相邻的词条,中间会隔一个白云山
    • 而match_phrase匹配的是相邻的词条
  • 可以借助slop参数解决词条间隔的问题
    • slop参数告诉match_phrase查询词条能够相隔多远时仍然将文档视为匹配
# 广州云山分词后相隔为 2,可以匹配到结果 
GET /es_db/_search
{"query":{"match_phrase":{"address":{"query":"广州云山","slop":2}}}}

多字段查询 multi_match

  • 可以根据字段类型,决定是否使用分词查询,得分最高的在前面
  • 字段类型分词,将查询条件分词之后进行查询,如果该字段不分词就会将查询条件作为整体进行查询
GET /es_db/_search
{"query":{"multi_match":{"query":"长沙张龙","fields":["address","name"]}}}

query_string

  • 允许我们在单个查询字符串中指定 AND | OR | NOT 条件,同时也支持多字段搜索
  • 在所有字段中搜索
  • 查询字段分词就将查询条件分词查询,查询字段不分词将查询条件不分词查询
  • 未指定字段查询
GET /es_db/_search
{"query":{"query_string":{"query":"张三 OR 橘子洲"}}}
  • 指定单个字段查询
GET /es_db/_search
{"query":{"query_string":{"default_field":"address","query":"白云山 OR 橘子洲"}}}
  • 指定多个字段查询
GET /es_db/_search
{"query":{"query_string":{"fields":["name","address"],"query":"张三 OR (广州 AND 王五)"}}}

simple_query_string

  • 类似 Query String,但是会忽略错误的语法
  • 同时只支持部分查询语法,不支持 AND OR NOT,会当作字符串处理
  • 支持部分逻辑
    • + 替代 AND
    • | 替代 OR
      - 替代 NOT
  • 默认的 operator 是 OR
GET /es_db/_search
{"query":{"simple_query_string":{"fields":["name","address"],"query":"广州公园","default_operator":"AND"}}}

关键词查询 Term

  • Term 用来使用关键词查询 (精确匹配),还可以用来查询没有被进行分词的数据类型
  • Term 是表达语意的最小单位
  • match 在匹配时会对所查找的关键词进行分词,然后按分词匹配查找
  • 而 term 会直接对关键词进行查找
  • 一般模糊查找的时候,多用 match,而精确查找时可以使用 term
  • 只有 text 类型分词
  • Term 查询,对输入不做分词
    • 会将输入作为一个整体,在倒排索引中查找准确的词项
    • 并且使用相关度算分公式为每个包含该词项的文档进行相关度算分
GET /es_db/_search
{"query":{"term":{"address":{"value":"广州白云"}}}}
  • 可以通过 Constant Score 将查询转换成一个 Filtering,避免算分,并利用缓存,提高性能
    • 将 Query 转成 Filter,忽略 TF-IDF 计算,避免相关性算分的开销
    • Filter 可以有效利用缓存
GET /es_db/_search
{"query":{"constant_score":{"filter":{"term":{"address.keyword":"广州白云山公园"}}}}}

结构化搜索

  • 结构化搜索 (Structured search) 是指对结构化数据的搜索
  • 结构化数据
    • 日期,布尔类型和数字都是结构化的
    • 文本也可以是结构化的
      • 如彩色笔可以有离散的颜色集合:红 (red) 、绿 (green)、蓝 (blue)
      • 一个博客可能被标记了标签,例如,分布式 (distributed) 和搜索 (search)
      • 电商网站上的商品都有 UPC (通用产品码 Universal Product Code) 或其他的唯一
      • 它们都需要遵从严格规定的、结构化的格式
  • 应用场景:对 bool,日期,数字,结构化的文本可以利用 term 做精确匹配
  • term 处理多值字段
    • term查询是包含,不是等于

前缀查询 prefix

  • 它会对分词后的 term 进行前缀搜索
    • 它不会分析要搜索的字符串,传入的前缀就是想要查找的前缀
    • 默认状态下,前缀查询不做相关度分数计算,它只是将所有匹配的文档返回,然后赋予所有相关分数值为1
    • 它的行为更像是一个过滤器而不是查询
    • 两者实际的区别就是过滤器是可以被缓存的,而前缀查询不行
  • prefix 的原理:需要遍历所有倒排索引,并比较每个 term 是否已所指定的前缀开头
GET /es_db/_search 
{"query":{"prefix":{"address":{"value":"广州"}}}}

通配符查询 wildcard

  • 通配符查询:工作原理和 prefix 相同,只不过它不是只比较开头,它能支持更为复杂的匹配模式
GET /es_db/_search 
{"query":{"wildcard":{"address":{"value":"*白*"}}}}

范围查询 range

  • range 范围关键字
    • gte 大于等于
    • lte 小于等于
    • gt 大于
    • lt 小于
    • now 当前时间
POST /es_db/_search 
{"query":{"range":{"age":{"gte":25,"lte":28}}}}
  • 日期 range
GET /product/_search 
{"query":{"range":{"date":{"gte":"now‐2y" }}}}

多 id 查询 ids

  • ids 关键字 : 值为数组类型,用来根据一组 id 获取多个对应的文档
GET /es_db/_search 
{"query":{"ids":{"values":[1,2]}}}

模糊查询 fuzzy

  • 使用 fuzziness 属性来进行模糊查询,从而达到搜索有错别字的情形
  • fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length
    • fuzziness:表示输入的关键字通过几次操作可以转变成为 ES 库里面的对应 field 的字段
      • 操作是指:新增一个字符,删除一个字符,修改一个字符,每次操作可以记做编辑距离为 1
        • 如中文集团到中威集团编辑距离就是1,只需要修改一个字符
      • 该参数默认值为0,即不开启模糊查询
    • prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配
      • 如这里等于1,则表示开头的1个字必须匹配,不匹配则不返回
      • 默认值也是0
      • 加大prefix_length的值可以提高效率和准确率
  • fuzzy 模糊查询 最大模糊错误 必须在0-2之间
    • 搜索关键词长度为 2,不允许存在模糊
    • 搜索关键词长度为3-5,允许1次模糊
    • 搜索关键词长度大于5,允许最大2次模糊
GET /es_db/_search
{"query":{"fuzzy":{"address":{"value":"白运山","fuzziness":1}}}}

高亮 highlight

  • highlight 关键字:可以让符合条件的文档中的关键词高亮
    • pre_tags 前缀标签
    • post_tags 后缀标签
    • tags_schema 设置为styled可以使用内置高亮样式
    • require_field_match 多字段高亮需要设置为false
GET /products/_search 
{"query":{"term":{"name":{"value":"牛仔"}}},"highlight":{"fields":{"*":{}}}}
  • 自定义高亮 html 标签
    • 可以在 highlight 中使用 pre_tags 和 post_tags
    • 多字段高亮:require_field_match 设置为 false
GET /products/_search
{"query":{"term":{"name":{"value": "牛仔"}}},"highlight":{"post_tags":["</span>"],"pre_tags":["<span style='color:red'>"], # 多字段高亮"require_field_match":"false","fields":{"*":{}}}}

这篇关于ElasticSearch-DSL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139552

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)

记录下,使用 docker-compose 安装 Elasticsearch 和 Kibana,并配置 IK 分词器,你可以按照以下步骤进行。此过程适用于 Elasticsearch 和 Kibana 8.10.4 版本。 安装 首先,在你的工作目录下创建一个 docker-compose.yml 文件,用于配置 Elasticsearch 和 Kibana 的服务。 version:

ElasticSearch底层原理简析

1.ElasticSearch简述 ElastiaSearch(以下简称ES)是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,支持RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。ES设计用于云计算中,能够进行实时搜索,支持PB级搜索,具有稳定,可靠,快速,安装使用方便等

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询; 一、首先启动相关服务: 二、新建一个film索引: 三、建立映射: 1、通过Head插件: POST http://192.168.1.111:9200/film/_mapping/dongzuo/ {"properties": {"title": {"type":

ElasticSearch 6.1.1运用代码添加索引及其添加,修改,删除文档

1、新建一个MAVEN项目:ElasticSearchTest 2、修改pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

Windows下安装Elasticsearch,启动报错,解决方法,访问

对于Windows用户,我们推荐使用MSI安装包进行安装。这个安装包使用图形用户界面来引导你进行安装。 首先,从这里https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.msi下载Elasticsearch 6.1.1的MSI安装包。 然后双击下载好的安装包文件启动图形化安装程序,在第一个界面,选

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)

目录 一、DSL查询 1.1 快熟入门 1.2 叶子查询 1.2.1 全文检索查询 1)match查询 2)multi_match查询 1.2.2 精确查询 1)term查询 2)range查询 3)ids查询 1.3 复合查询 1.3.1 bool查询 1.3.2 算分函数查询 1)基本语法: 2)运行流程: 3)示例: 4)执行结果: 1.4 排序 1.5

Mac使用Elasticsearch

下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz  修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.