| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> es入门 和 dsl语法部分讲解 -> 正文阅读 |
|
[大数据]es入门 和 dsl语法部分讲解 |
ElasticSearch与Lucene的关系 Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库(框架) 但是想要使用Lucene,必须使用Java来作为开发语言并将其直接集成到你的应用中,并且Lucene的配置及使用非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。 Lucene缺点: ???1)只能在Java项目中使用,并且要以jar包的方式直接集成项目中. ???2)使用非常复杂-创建索引和搜索索引代码繁杂 ???3)不支持集群环境-索引数据不同步(不支持大型项目) ?? ???4)索引数据如果太多就不行,索引库和应用所在同一个服务器,共同占用硬盘.共用空间少. 上述Lucene框架中的缺点,ES全部都能解决. ES vs Solr比较 当单纯的对已有数据进行搜索时,Solr更快。 当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。 因为一般互联网公司都是 实时建立索引 查询的 大型互联网公司,实际生产环境测试,将搜索引擎从Solr转到 Elasticsearch以后的平均查询速度有了50倍的提升。 总结: 二者安装都很简单。 1、Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。 2、Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。 3、Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。 4、Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用。 1.4.2 ES vs 关系型数据库 为什么海量数据es比mysql快 因为?不像mysql 一条数据就增长一行 常用单词(汉字)就那么多, 那么就不会无限增长 2. ?Lucene全文检索框架 2.1 ?什么是全文检索 全文检索是指:
1、倒排索引: 索引就类似于目录,平时我们使用的都是索引,都是通过主键定位到某条数据,那么倒排索引呢,刚好相反,数据对应到主键.这里以一个博客文章的内容为例: 1.索引
2.分词原理之倒排索引 假如,我们有一个站内搜索的功能,通过某个关键词来搜索相关的文章,那么这个关键词可能出现在标题中,也可能出现在文章内容中,那我们将会在创建或修改文章的时候,建立一个关键词与文章的对应关系表,这种,我们可以称之为倒排索引,因此倒排索引,也可称之为反向索引.如:
注:这里涉及中文分词的问题 2、安装出现异常 1)尽量不要复制pdf中的文字,可以复制有道云笔记中的文字 2、ES比较耗内存,建议虚拟机4G或以上内存 jvm1g以上的内存分配 英文分词用空格区分? ?原始数据在索引库里面还是存在的 中文分词就麻烦 倒排索引 就是根据关键词来搜索文章id 正排索引:根据id(索引) 找词条(记录信息) Elasticsearch中的核心概念 3.1 ?索引 index 一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引 一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字 3.2 ?映射 mapping ?ElasticSearch中的映射(Mapping)用来定义一个文档 mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分词器、是否被索引等等,这些都是映射里面可以设置的 3.3 ?字段Field 相当于是数据表的字段|列 3.4 ?字段类型 Type 每一个字段都应该有一个对应的类型,例如:Text、Keyword、Byte等 3.5 ?文档 document 一个文档是一个可被索引的基础信息单元,类似一条记录。文档以JSON(Javascript Object Notation)格式来表示; 3.6 ?集群 cluster 一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能 3.7 ?节点 node 一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能 ?一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中 这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中 ?在一个集群里,可以拥有任意多个节点。而且,如果当前网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。 3.8 ?分片和副本 shards&replicas 3.8.1 ?分片
? 允许水平分割/扩展你的内容容量 允许在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量
3.8.2 ?副本
1) ?在分片/节点失败的情况下,提供了高可用性。 注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的 (错峰 和redis cluster一样) 2) 扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行 每个索引可以被分成多个分片。一个索引有0个或者多个副本 一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数量可以在索引 创建的时候指定在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量 5 客户端Kibana安装 5.1客户端可以分为图形界面客户端,和代码客户端. 5.2 ES主流客户端Kibana,开放9200端口与图形界面客户端交互 安装IK分词器 IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始, IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。 指定IK分词器作为默认分词器 ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如我搜索关键词“清华大学”,这时候会按“清”,“华”,“大”,“学”去分词,然后搜出来的都是些“清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔”之类的莫名其妙的结果,这里我们就想把这个分词方式修改一下,于是呢,就想到了ik分词器,有两种ik_smart和ik_max_word。 ik_smart会将“清华大学”整个分为一个词,而ik_max_word会将“清华大学”分为“清华大学”,“清华”和“大学”,按需选其中之一就可以了。 修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):
8.ES数据管理 8.1 ES数据管理概述 ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。 然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。 在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用JSON作为文档序列化格式。 JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。 ES存储的一个员工文档的格式示例:
8.2 基本操作 1) 创建索引 格式: PUT /索引名称
2) 查询索引 格式: GET /索引名称
3) 删除索引 格式: DELETE /索引名称
4) 添加文档 格式: PUT /索引名称/类型/id
5) 修改文档
注意:POST和PUT都能起到创建/更新的作用 1、需要注意的是==PUT==需要对一个具体的资源进行操作也就是要确定id才能进行==更新/创建,而==POST==是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行==创建==新文档,如果填了id那就针对这个id的文档进行创建/更新 2、PUT只会将json数据都进行替换, POST只会更新相同字段的值 3、PUT与DELETE都是幂等性操作, 即不论操作多少次, 结果都一样 6) 查询文档
7) 删除文档
9.Restful认识 Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。 基于Restful API?ES和所有客户端的交互都是使用JSON格式的数据. 其他所有程序语言都可以使用RESTful API,通过9200端口的与ES进行通信 GET查询 PUT添加 POST修改 DELE删除 用户做crud
使用Restful的好处: 透明性,暴露资源存在。 充分利用 HTTP 协议本身语义,不同请求方式进行不同的操作 10.查询操作 10.1 查询当前类型中的所有文档 _search
10.2 条件查询, 如要查询age等于28岁的 _search?q=*:***
10.3 范围查询, 如要查询age在25至26岁之间的 _search?q=***[** TO **] ?注意: TO 必须为大写
10.4 根据多个ID进行批量查询 _mget
10.5 查询年龄小于等于28岁的 :
10.6 查询年龄大于28前的 :>
10.7 分页查询 from=*&size=*
10.8 对查询结果只输出某些字段 _source=字段,字段
10.9 对查询结果排序 sort=字段:desc/asc 格式: GET /索引名称/类型/_search?sort=字段 desc
7.x后的es type(类似数据库的表)都是统一的 _doc 这样的? 8 版本的就直接没了 dsl 是es查询的核心 复杂查询 DSL语言高级查询 1.Query DSL概述 Domain Specific Language 领域专用语言 Elasticsearch provides a ful1 Query DSL based on JSON to define queries Elasticsearch提供了基于JSON的DSL来定义查询。 DSL由叶子查询子句和复合查询子句两种子句组成。 2.无查询条件 无查询条件是查询所有,默认是查询所有的,或者使用match_all表示所有
把es所有索引库的信息返回回去 了解一下就行 一般不怎么用 3.有查询条件 3.1 叶子条件查询(单字段查询条件) 3.1.1 模糊匹配 模糊匹配主要是针对文本类型的字段,文本类型的字段会对内容进行分词,对查询时,也会对搜索条件进行分词,然后通过倒排索引查找到匹配的数据,模糊匹配主要通过match等参数来实现
match的复杂用法 match条件还支持以下参数:
3.1.2 精确匹配
3.2 组合条件查询(多条件查询) 组合条件查询是将叶子条件查询语句进行组合而形成的一个完整的查询条件
must/filter/shoud/must_not?等的子条件是通过?term/terms/range/ids/exists/match?等叶子条件为参数的 注:以上参数,当只有一个搜索条件时,must等对应的是一个对象,当是多个条件时,对应的是一个数组 3.3 连接查询(多文档合并查询)
3.4 DSL查询语言中存在两种:查询DSL(query DSL)和过滤DSL(filter DSL) 它们两个的区别如下图: query DSL 在查询上下文中,查询会回答这个问题——“这个文档匹不匹配这个查询,它的相关度高么?” 如何验证匹配很好理解,如何计算相关度呢?ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。(就是平时搜索排在前面的)另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。 filter DSL 在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?” 答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点。 过滤上下文 是在使用filter参数时候的执行环境,比如在bool查询中使用must_not或者filter 另外,经常使用过滤器,ES会自动的缓存过滤器的内容,这对于查询来说,会提高很多性能。 一些过滤的情况: 3.5 Query方式查询:案例
注意: 采用term精确查询, 查询字段映射类型属于为keyword.??单个条件相等? 代表下面的信息不需要分词了 举例:
term查询keyword字段。 ?term不会分词。而keyword字段也不分词。需要完全匹配才可。 term查询text字段。 因为text字段会分词,而term不分词,所以term查询的条件必须是text字段分词后的某一个。
举例:
注:json请求字符串中部分字段的含义 range:范围关键字 gte 大于等于 lte ?小于等于 gt 大于 lt 小于 now 当前时间
3.6 Filter过滤器方式查询,它的查询不会计算相关性分值,也不会对结果进行排序, 因此效率会高一点,查询的结果可以被缓存。 Filter Context 对数据进行过滤
总结: 1. match match:模糊匹配,需要指定字段名,但是输入会进行分词,比如"hello world"会进行拆分为hello和world,然后匹配,如果字段中包含hello或者world,或者都包含的结果都会被查询出来,也就是说match是一个部分匹配的模糊查询。查询条件相对来说比较宽松。 ? 2. term term: 这种查询和match在有些时候是等价的,比如我们查询单个的词hello,那么会和match查询结果一样,但是如果查询"hello world",结果就相差很大,因为这个输入不会进行分词,就是说查询的时候,是查询字段分词结果中是否有"hello world"的字样,而不是查询字段中包含"hello world"的字样。当保存数据"hello world"时,elasticsearch会对字段内容进行分词,"hello world"会被分成hello和world,不存在"hello world",因此这里的查询结果会为空。这也是term查询和match的区别。 ?? 虽然books中有name="java in action"的book,但是term查询还是查询不出来结果。只有使用单个词做索引才能查询出结果: ? 3. match_phase???也就是短语查询 match_phase:会对输入做分词,但是需要结果中也包含所有的分词,而且顺序要求一样。以"hello world"为例,要求结果中必须包含hello和world,而且还要求他们是连着的,顺序也是固定的,hello that world不满足,world hello也不满足条件。 增加分词: 将查询分词顺序打乱,就查询不出结果了: ? 4. query_string query_string:和match类似,但是match需要指定字段名,query_string是在所有字段中搜索,范围更广泛。 ? match查询keyword字段 match会被分词,而keyword不会被分词,match的需要跟keyword的完全匹配可以。 match查询text字段 match分词,text也分词,只要match的分词结果和text的分词结果有相同的就匹配。 文档映射 1.ES中映射可以分为动态映射和静态映射 动态映射:? 在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射(即关系型数据库的表、字段等),在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。 动态映射规则如下: 静态映射: 静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。 2 动态映射 2.1 删除原创建的索引
2.2 创建索引
2.3 创建文档(ES根据数据类型, 会自动创建映射)
设置文档映射
四.核心类型(Core datatype) 字符串:string,string类型包含 text 和 keyword。 text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合。 keyword:该类型不能分词,可以被用来检索过滤、排序和聚合,keyword类型不可用text进行分词模糊检索。 数值型:long、integer、short、byte、double、float 日期型:date 布尔型:boolean 五.keyword 与 text 映射类型的区别 将 book 字段设置为 keyword 映射 (只能精准查询, 不能分词查询,能聚合、排序)
将 book 字段设置为 text 映射能模糊查询, 能分词查询,不能聚合、排序)
六.创建静态映射时指定text类型的ik分词器 1.设置ik分词器的文档映射 先删除之前的es_db 再创建新的es_db 定义ik_smart的映射
2.分词查询
七.对已存在的mapping映射进行修改 具体方法 1)如果要推倒现有的映射, 你得重新建立一个静态索引 2)然后把之前索引里的数据导入到新的索引里 3)删除原创建的索引 4)为新索引起个别名, 为原索引名
注意: 通过这几个步骤就实现了索引的平滑过渡,并且是零停机 八.Elasticsearch乐观并发控制 在数据库领域中,有两种方法来确保并发更新,不会丢失数据: 1、悲观并发控制 这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。 2、乐观并发控制 Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。 3、再以创建一个文档为例 ES老版本
4、实现_version乐观锁更新文档
5、ES新版本(7.x)不使用version进行并发版本控制 if_seq_no=版本值&if_primary_term=文档位置 _seq_no:文档版本号,作用同_version _primary_term:文档所在位置
if_seq_no 和 if_primary_term意义 if_seq_no 和 if_primary_term 是用来并发控制,他们和version不同,version属于当个文档,而seq_no属于整个index。 _primary_term表示文档所在主分片的编号 _primary_term:_primary_term也和_seq_no一样都是整数,每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。 _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,比如当一个shard宕机了,raplica需要用到最新的数据,就会根据_primary_term和_seq_no这两个值来拿到最新的document ES集群环境搭建?? 不同节点 集群名称相同 节点名称不同 ip不同 注意:搭建es集群,启动三个es节点,访问elasticsearch-head时只显示一个master 解决方案:进到节点2、3的/elasticsearch-7.6.1/data/目录下删除nodes文件,之后重启节点2、3的es进程即可 下图打上星号的是主节点 集群 主分片出问题? 备份分片? 还是有数据的 不会丢失 Elasticsearch-head插件 由于es服务启动之后,访问界面比较丑陋,为了更好的查看索引库当中的信息,我们可以通过安装elasticsearch-head这个插件来实现,这个插件可以更方便快捷的看到es的管理界面 elasticsearch-head这个插件是es提供的一个用于图形化界面查看的一个插件工具,可以安装上这个插件之后,通过这个插件来实现我们通过浏览器查看es当中的数据 安装elasticsearch-head这个插件这里提供两种方式进行安装,第一种方式就是自己下载源码包进行编译,耗时比较长,网络较差的情况下,基本上不可能安装成功。 第二种方式就是直接使用我已经编译好的安装包,进行修改配置即可 要安装elasticsearch-head插件,需要先安装Node.js |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/18 21:04:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |