ElasticSearch 高级查询语法Query DSL实战

ES倒排索引
当数据写入 ES 时,数据将会通过 分词 被切分为不同的 term,ES 将 term 与其对应的文 档列表建立一种映射关系,这种结构就是 倒排索引。如下图所示:
为了进一步提升索引的效率,ES 在 term 的基础上利用 term 的前缀或者后缀构建了 term index, 用于对 term 本身进行索引,ES 实际的索引结构如下图所示:

这样当我们去搜索某个关键词时,ES 首先根据它的前缀或者后缀迅速缩小关键词的在 term dictionary 中的范围,大大减少了磁盘IO的次数。
        
单词词典(Term Dictionary) :记录所有文档的单词,记录单词到倒排列表的 关联关系
        常用字典数据结构:
        

倒排列表(Posting List)-记录了单词对应的文档结合,由倒排索引项组成

倒排索引项(Posting):
        文档ID
        词频TF–该单词在文档中出现的次数,用于相关性评分
        位置(Position)-单词在文档中分词的位置。用于短语搜索 (match phrase query)
        偏移(Offset)-记录单词的开始结束位置,实现高亮显示

Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引。

可以指定对某些字段不做索引:
        优点︰节省存储空间
        缺点: 字段无法被搜索
文档映射Mapping
Mapping类似数据库中的schema的定义 ,作用如下:
        定义索引中的字段的名称
        定义字段的数据类型,例如字符串,数字,布尔等
        字段,倒排索引的相关配置(Analyzer)
ES中Mapping映射可以分为动态映射和静态映射

动态映射:
在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类 型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映 射(即关系型数据库的表、字段等), 在文档写入Elasticsearch时,会根据文档字段自动识 别类型,这种机制称之为动态映射。
静态映射:
静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器 等,这种方式称之为静态映射。动态映射(Dynamic Mapping)的机制,使得我们无需手动定Mappings,
Elasticsearch会自动根据文档信息,推算出字段的类型。但是有时候会推算的不对,例如地 理位置信息。 当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
Dynamic Mapping类型自动识别:

示例
#删除原索引DELETE /user#创建文档(ES根据数据类型, 会自动创建映射)PUT /user/_doc/1{"name":"yanqiuxiang","age":34,"address":"江西南昌"}#获取文档映射GET /user/_mapping

思考:能否后期更改Mapping的字段类型?

两种情况:
新增加字段
      1、  dynamic设为true时,一旦有新增字段的文档写入,Mapping 也同时被更新
        2、dynamic设为false,Mapping 不会被更新,新增字段的数据 无法被索引,但是信息会出现在 _source中
        3、dynamic设置成strict(严格控制策略),文档写入失败,抛出异常      
   
对已有字段,一旦已经有数据写入,就不再支持修改字段定义
        Lucene 实现的倒排索引,一旦生成后,就不允许修改
如果希望改变字段类型,可以利用 reindex API,重建索引
原因:
        如果修改了字段的数据类型,会导致已被索引的数据无法被搜索
        但是如果是增加新的字段,就不会有这样的影响
dynamic设置成strict,新增字段导致文档插入失败
PUT /user
{"mappings": {"dynamic": "strict","properties": {"name": {"type": "text"},"address": {"type": "object","dynamic": "true"}}}
}

修改dynamic后再次插入文档成功

#修改daynamicPUT /user/_mapping{"dynamic":true}
对已有字段的mapping修改
具体方法:
1)如果要推倒现有的映射, 你得重新建立一个静态索引
2)然后把之前索引里的数据导入到新的索引里
3)删除原创建的索引
4)为新索引起个别名, 为原索引名
PUT / user2 
{"mappings": {"properties": {"name": {"type": "text"},"address": {"type": "text","analyzer": "ik_max_word"}}}
}POST _reindex 
{"source": {"index": "user"},"dest": {"index": "user2"}
}DELETE /userPUT /user2/_alias/userGET /user
注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机
常用Mapping参数配置
        index: 控制当前字段是否被索引,默认为true。 如果设置为false,该字段不可被搜索
PUT /user 
{"mappings": {"properties": {"address": {"type": "text","index": false},"age": {"type": "long"},"name": {"type": "text"}}}
}

有四种不同基本的index options配置,控制倒排索引记录的内容:
        docs : 记录doc id
        freqs:记录doc id 和term frequencies(词频)
        positions: 记录doc id / term frequencies / term position
        offsets: doc id / term frequencies / term posistion/character offsets

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/165024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

com.genuitec.eclipse.springframework.springnature

Your IDE is missing natures to properly support your projects. Some extensions on the eclipse marketplace can be installed to support those natures. com.genuitec.eclipse.springframework.springnature 移除 <nature>om.genuitec.eclipse.springframework.…

【LeetCode力扣】42.接雨水(困难)

目录 1、题目介绍 2、解题 2.1、解题思路 2.2、图解说明 2.3、解题代码 1、题目介绍 原题链接&#xff1a;42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,…

维控PLC——LX1S :编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址维控 LX1S通讯协议举例 说明 该协议适用于维控LX1S系列PLC&#xff0c;关于维控LX2N的协议将在后面描述。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令字地址&#xff08;有些无&#xff09…

Vscode禁止插件自动更新

由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2&#xff0c;电脑vscode的python插件装的也是2022年4月份的某个版本&#xff0c;但插件经常自动更新&#xff0c;导致python代码无法Debug,解决办法&#xff1a; 点设置&#xff0c;搜autoUpdate, 把红色框选成无

Django(一、简介,安装与使用)

文章目录 一、Django引入1.web应用程序什么是web&#xff1f;web引用程序的优点web应用程序的缺点什么是web框架 2.纯手写web框架1.web框架的本质2.HTTP协议的特性&#xff1a;3.编写基于wsgire模块搭建web框架代码封装优化代码封装 二、Django框架的学习1.Python中的主流框架2…

2023年11月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

计算机提示找不到concrt140.dll怎么办,分享4个有效的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示或者系统崩溃的情况。其中&#xff0c;concrt140.dll是一个常见的错误提示&#xff0c;这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复措施。本文将介绍4个修复conc…

【广州华锐互动】3D全景虚拟旅游在文旅行业的应用场景

随着科技的不断发展&#xff0c;3D全景虚拟旅游正在成为一种新兴的旅游体验方式&#xff0c;它可以帮助旅游者更加深入地了解旅游信息&#xff0c;提升旅游体验。下面我们将详细介绍3D全景虚拟旅游可以应用于哪些场景。 一、旅游规划 3D全景虚拟旅游可以帮助旅游者更加直观地进…

Docker 介绍

Docker 介绍 1 介绍1.1 概述1.2 资源高效利用1.3 发展历程1.4 组件1.5 工具1.6 对环境部署和虚拟化的影响1.7 优点1.8 容器技术核心CgroupNamespaceUnionFS 2 命令信息、状态、配置info命令用于显示当前系统信息、docker容器、镜像个数、设置等信息 镜像容器资源 3 安装3.1 版本…

《LeetCode力扣练习》代码随想录——数组(长度最小的子数组---Java)

《LeetCode力扣练习》代码随想录——数组&#xff08;长度最小的子数组—Java&#xff09; 刷题思路来源于 代码随想录 209. 长度最小的子数组 滑动窗口——O(n) class Solution {public int minSubArrayLen(int target, int[] nums) {if(nums.length1){return nums[0]>targ…

【python海洋专题四十】海洋指数画法--单色填充图

【python海洋专题四十】海洋指数画法–单色填充图 【python海洋专题四十】海洋指数画法–单色填充图 数据:AMO_index 图像展示: 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【p…

github 上传代码报错 fatal: Authentication failed for ‘xxxxxx‘

问题 今天一时兴起创建了个 github 新仓库&#xff0c;首次上传本地代码时&#xff0c;遇到了一个报错。本来以为是账号密码的问题&#xff0c;搞了好几次&#xff0c;发现都没错的情况下还是上传不上去。目测判断是认证相关问题&#xff0c;具体报错信息如下&#xff1a; rem…