Elasticsearch 基础 DSL 命令

2023-11-08

Elasticsearch 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html

1. 模拟请求

用于查看 es 服务是否正常启动

# 模拟请求
GET /

2. 分词器相关

ik 分词器是 es 的扩展插件,需要自行安装

ik 分词器开源地址:https://github.com/medcl/elasticsearch-analysis-ik

# 标准分词器
POST /_analyze
{
  "analyzer": "standard",
  "text": "Hello world!!"
}

# 英文分词器
POST /_analyze
{
  "analyzer": "english",
  "text": "Hello world!!"
}

# 中文分词器,无效果
POST /_analyze
{
  "analyzer": "chinese",
  "text": "你好呀!!"
}

# ik分词器-最少模式,分词结果:[程序员]
POST /_analyze
{
  "analyzer": "ik_smart",
  "text": ["程序员"]
}

# ik分词器-最多模式,分词结果:[程序员,程序,员]
POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": ["程序员"]
}

3. 索引库相关

下面示例添加了一个名为 blog 的索引库

包含的字段有:id, author, title, content

后续的更新添加了一个 tags 字段

其中,copy_to 用于将字段值复制给 all 字段,将来匹配查询只需对 all 字段匹配即可,避免多字段匹配带来的的性能问题

另外 all 字段内容不会被展示

# 创建索引库
PUT /blog
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "author": {
        "type": "keyword",
        "copy_to": "all"
      },
      "title": {
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "content": {
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "all": {
        "type": "text"
        , "analyzer": "ik_max_word"
      }
    }
  }
}

# 查询索引库
GET /blog

# 修改索引库(只能添加新字段)
PUT /blog/_mapping
{
  "properties": {
    "tags": {
      "type": "text",
      "analyzer": "ik_max_word",
      "copy_to": "all"
    }
  }
}

# 删除索引库
DELETE /blog

4. 文档相关

文档的增删查改操作示例

其中 blog 为上面创建的索引库

其中 1 为文档的 _id,是字符串类型,而非数字

_id 是每个文档都有的元字段,而非索引库中的 id 属性字段

# 新增文档
# 新增文档
POST /blog/_doc/1
{
  "id": "1",
  "author": "云中鹤",
  "title": "年轻人要制服诱惑",
  "content": "必须制服环境中的诱惑,才能做到心中无愧。"
}

# 查询
GET /blog/_doc/1

# 删除
DELETE /blog/_doc/1

# 更新(全量修改,覆盖旧文档)
PUT /blog/_doc/1
{
  "id": "1",
  "author": "云中鹤",
  "title": "此文章不可见"
}

# 更新(增量修改,只更新指定属性)
POST /blog/_update/1
{
  "doc": {
    "content": "文章已被封禁!"
  }
}

5. 查询相关

# ---------- 查询相关 ------------

# match_all 查询所有(有分页限制,并非全部)
GET /blog/_search
{
  "query": {
    "match_all": {}
  }
}

# match 字段匹配查询
GET /blog/_search
{
  "query": {
    "match": {
      "all": "制服"
    }
  }
}


# multi_match 多字段匹配查询
GET /blog/_search
{
  "query": {
    "multi_match": {
      "query": "制服",
      "fields": ["title", "content"]
    }
  }
}

# term 精确查询(只可指定一个字段)
GET /blog/_search
{
  "query": {
    "term": {
      "author": {
        "value": "云中鹤"
      }
    }
  }
}

# range 范围查询(gt 表示大于,lt 表示小于,e 表示包含等于,可只指定一端)
GET /blog/_search
{
  "query": {
    "range": {
      "id": {
        "gte": 1,
        "lte": 20
      }
    }
  }
}

6. GEO 查询

下例是在 hotel 索引库中,根据 location 字段进行 geo 范围查询(location 之外的均为关键字)

在 geo 坐标中,前为纬度,后为经度

# ---------- GEO 查询 ------------

# distance 以圆心与距离查询
GET /hotel/_search
{
  "query": {
    "geo_distance": {
      "distance": "5km",
      "location": "39.90, 116.38"
    }
  }
}

# bounding_box 以矩形范围查询(指定左上与右下两点坐标)
GET /hotel/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 39.90,
          "lon": 116.38
        },
        "bottom_right": {
          "lat": 39.00,
          "lon": 116.00
        }
      }
    }
  }
}

7. 组合查询

  • must:必须匹配所有子查询,且运算
  • should:选择性匹配子查询,或运算
  • must_not:必须不匹配所有子查询,非运算
  • filter:必须匹配,效果与 must 相同,但不参与算分

使用 should 同时并列使用了 must 或者 filter,则 should 无效

有下面两种解决方法:

  1. bool 中添加 "minimum_should_match": 1属性,表示必须至少匹配一个 should 中的条件,若不存在 should 语句,则查不到文档
  2. 在 must 中嵌套添加 bool 查询,其中只包含 should 查询条件

示例:

# ---------- 组合查询 ------------

# Boolean Query
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "酒店"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gt": 400
            }
          }
        }
      ],
      "minimum_should_match": 1, 
      "should": [
        {
          "term": {
            "brand": {
              "value": "如家"
            }
          }
        },
        {
          "term": {
            "brand": {
              "value": "速8"
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 39.9,
              "lon": 116.38
            }
          }
        }
      ]
    }
  }
}

8. 得分加权

在这里插入图片描述functions 是一个数组,若某一文档符合多个,则使函数结果相乘,再做 boost_mode 的操作

查到的文档中的 _score 字段表示得分

示例:

# Function Score
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "酒店北京"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          },
          "weight": 10
        }
      ],
      "boost_mode": "sum"
    }
  }
}

9. 排序

可排序的类型有 keyword 类型,数值类型,日期类型,地理坐标距离(字符串按照字典序)

asc 表示升序,desc 表示降序

多个排序规则先按照第一个规则排序,相等时按照下一个规则排序,以此类推

“sort” 属性与最外层的 “query” 并列

查到的文档会有 sort 属性,包含了排序依据的值

示例:

# hotel 为索引库名,price 与 location 为库中字段名
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    },
    {
      "_geo_distance": {
        "location": {
          "lat": 39.00,
          "lon": 116.00
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

10. 分页

默认只返回前 10 个文档的信息

一般使用 from 与 search_after 两种方式进行分页

from 方式涉及深度分页问题,底层为逻辑分页,可能消耗较大内存,结果集上限为 10,000 条

search_after 方式依赖于排序,通过指定上一页最后一条数据的排序值来搜索下一页,不可随机分页(注意处理相同值问题)

# from + size 分页
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": "asc"
    }
  ],
  "from": 0,
  "size": 10
}


# search_after + size 分页(price 可能相同,但 id 唯一)
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score": "asc"
    },
    {
      "id": "asc"
    }
  ],
  "search_after": [
    0,
    0
  ],
  "size": 10
}

11. 高亮

高亮用于强调搜索出的文档中,与搜索词的匹配位置

示例:

# highlight
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "酒店,北京"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false",
        "pre_tags": "<em>",
        "post_tags": "</em>"
      }
    }
  }
}

上例中 all 为拷贝字段,name 为需要高亮的字段,两种不为同一字段,需要加 "require_field_match": "false" 属性

es 默认高亮前后添加 <em> 标签,不写 pre_tags,post_tags 也可生效

搜索出的文档后会跟上 highlight 属性值,为高亮后的字段

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch 基础 DSL 命令 的相关文章

随机推荐

  • vue 全局过滤器 时间格式 转换

    vue 项目要求将时间戳转成规定的时间格式 可以借助 moment js 完成 现要确定自己的数据是时间戳 安装命令 npm install moment save main js import moment from moment 设置过
  • Oracle日期格式yyyymmdd格式化为yyyy-mm-dd

    问题 日期展示为20200828需要展示为2020 08 28 解决 select TO CHAR TO DATE 20200828 yyyyMMdd YYYY MM DD FKDAT from dual 结果展示 2020 08 28
  • Docker安装Nginx+FTP访问静态资源

    1 拉取Nginx镜像 docker pull nginx latest 2 创建挂载目录 mkdir p server nginx conf mkdir p server nginx log mkdir p server nginx ht
  • 安装Ubuntu的注意事项

    安装win10 Ubuntu elemengtory OS直接进入win10而不出现linnux引导的问题 1 进入BIOS 启动UEFI 关闭Security 2 分区时应该注意的事项 1 swap 2000MB 主分区引导 起始 2 E
  • Pandas 缺失号

    三种缺失符号及其对比 pandas 1 0之前 三种记号 pandas 1 0 np nan None np NaT 时间序列用 类型 float64 Nonetype pandas libs tslibs nattype NaTType
  • mybatis 拼接动态表名、字段名

    转载地址 https blog csdn net xiaoxiangzi520 article details 76719098 今天在项目中遇到个需求是要动态的根据前台传入的字段名称和升降序条件在mybatis里动态拼接sql语句进行查询
  • Java类成员变量的默认值

    1 布尔型 boolean 变量默认值为false byte short int long为0 字符型为 u0000 空字符 浮点型 float double 为0 0 引用类型 String 为null package cn nxl201
  • shell算数运算

    i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k i j k 等价于 i expr j k Let expressions 执行一个或多个表达式 表达式中的变量前不
  • 量化投资学习-15:散户与庄家共赢策略之价值长线策略

    散户的尴尬 在前面的文章 量化投资学习 13 一张图残酷的展现了庄家 量化交易者 散户的盈利空间的对比 中分析过 如果散户追求短期利益 采用短期炒作的操作策略 实际的利润空间非常狭小 只能是尾部或头部空间 稍不留神 就会导致亏损 化解尴尬的
  • 微信小程序接入微信支付(四):接收支付结果通知与沙箱测试

    代码主体写完后 还有不可或缺的部分需要补充完整 即接收支付结果通知 官方文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 9 7 index 8 目录 微信小程序
  • 线程的基本概念,线程的同步互斥机制

    一 线程的概念 1 1 什么是线程 线程 线程是进程的一个实体 是被系统独立调度和分派的基本单位 是一个进程并发执行多个任务的机制 并发 单核CPU多任务同时运行 CPU以ms级进行进程调度 1 2 为什么引入线程 进程间的切换表现为上下文
  • 计算机设备显示感叹号,设备管理器有感叹号和问号未知设备的解决方法

    设备管理器有感叹号和问号未知设备怎么办 因为在Windows操作系统中 设备管理器是管理计算机硬件设备的工具 我们可以借助设备管理器查看计算机中所安装的硬件设备 设置设备属性 安装或更新驱动程序 停用或卸载设备 可以说是功能非常强大 但有时
  • VC 如何使程序运行后自己删除自己

    VC 如何使程序运行后自己删除自己 有时候 我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序 很明显如果一个进程通过直接调用DeleteFile 来删除自己是不可能的 必须另想办法 经过本人在网上参考很多资料后实际测试并集众家
  • Onnxruntime-CUDA版本对应

    ONNX Runtime CUDA cuDNN 1 14 1 13 1 1 13 11 6 8 2 4 Linux 8 5 0 96 Windows 1 12 1 11 11 4 8 2 4 Linux 8 2 2 26 Windows 1
  • Flink源码-SlidingProcessTimeWindow的创建和触发

    今天研究了下SlidingProcessTimeWindow的源码 把TimeWindow的生成和触发计算 大致搞清楚了 写一篇博客记录下 要点 这里讲的是ProcessTime的滑动窗口 每条数据都会触发窗口的分配 创建 一条数据可能分配
  • 基于鲸鱼算法优化支持向量机SVM的分类预测,基于WOA-SVM的光谱分类

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 鲸鱼算法的原理及步骤 SVM应用实例 基于鲸鱼算法改进SVM的光谱分类 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机 support vector m
  • 【qt】error: C2248: “QVariant::QVariant”: 无法访问 private 成员(在“QVari

    错误信息 main A a new A engine rootContext gt setContextProperty a a C2248 QVariant QVariant 无法访问 private 成员 在 QVariant 类中声明
  • Unity发布WebGL如何把文件下载到本地——后续,详细实现。

    Unity发布WebGL如何把文件下载到本地 后续 详细实现 前言 一 编写jslib 二 引入dll 编写C 脚本 三 最终效果 总结 版权声明 前言 以前的问题https blog csdn net Wrinkle2017 articl
  • 10.28 云计算

    课上实验实训1 获取令牌 生效环境变量 source etc keystone admin openrc sh 验证令牌 openstack role list 查看角色列表 openstack user list 查看用户列表 opens
  • Elasticsearch 基础 DSL 命令

    Elasticsearch 基础 DSL 命令 1 模拟请求 2 分词器相关 3 索引库相关 4 文档相关 5 查询相关 6 GEO 查询 7 组合查询 8 得分加权 9 排序 10 分页 11 高亮 Elasticsearch 官方文档