ES搜索引擎

基本概念:

  索引Index

    es吧数据放到一个或者多个索引中,如果用关系型数据库模型对比,索引的地位与数据库实例(db)相当。索引存放和读取的基本单元是文档(document)。es内部使用的是apache lucene实现的索引中数据的读写。(es被视为单独的一个索引,在lucene中不止一个,因为分布式中,es会用到分区shards和备份replicas机制讲一个索引存储多份)。

  文档document

    在es中,文档主要是存储实体。所有的es应用需求最后都需要统一建成一个检索模型:检索相关文档。

文档由一个或多个域,每个域field由一个域名或多个值组成(有多个值的称为多值域)。

在es中每个文档都可能会有不同的域field集合;也就是说文档是没有固定的模式和同意的结构的。文档之间保持的相似性即可。

在客户端角度来看,文档就是一个json对象。

参数映射  所有的文档在存储之前都必须分析(analyze)流程,用户可以配置输入文本分解成token的方式:哪些token呗滤掉;或者其它的处理流程,比如去除html标签。

  文档类型(type)

    每个文档在es中都必须设定它的类型。文档类型使得同一个索引中在存储结构不同文档时,只需根据文档类型就可以找到对应的参数映射信息,方便文档的存取。

   节点Node

     单独es服务器实例成为一个节点。

    集群Cluster

      集群能够存储超出单机容量的信息。由于目前单点就可以满足咱们的需求,就不详细介绍了。

    索引副本Replica

      通过索引分片机制可以想es集群中导入超过单机容量的数据,客户端操作任意一个节点接口实现对集群数据的读写。(不做详细解释了)

    时间之门gateway

      在运行的过程中,es会收到集群的状态,索引的参数等信息。这些呗存储在gateway中。

    

  es背后核心理念:

    es是构造极少数的几个极少数的概念之上的。

    开箱急用。

    天生集群。

    自动容错。

    扩展性强。

   

  es工作原理:

    启动过程:

    当es节点启动后,会利用 多播(multicast)或单播(别问我什么是单播,多播,没必要纠结这些)寻找病简历链接。如图:

  在集群中,一个节点呗选举成主节点。这个节点扶着管理集群的状态,当集群的拓展结构改变时把索引分区分派到相对性的节点上。

  在用户角度看节点在es中并没有占据主要位置,这与其它系统是不同的(数据库系统)。实际上用户并不需要知道哪个节点是主节点;所有的操作需求可以发到任意节点,es内部完成这些工作。必要时任意节点都可以并发的把查询自居分发到其他节点,然后合并各个节点返回的查询结果。最后返回用户一个完整结果集。所有的这些工作不需要经过主节点转发(节点之前通过p2p的方式通讯)。

  在必要时,会进行恢复工作。这时主节点会去检查哪些分片可用,决定用哪些分片。处理完后,集群转入黄色状态。

  这意味着集群可以处理搜索请求了。但是还没有火力全开(这主要是由于所有的主索引分区都已经分配好了,但是索引副本还没有)。接下来就是找到复制好的分区,病设置成索引副本。当一个分区数量太少时,主节点会界定将缺少的分区放到哪个节点中,并且依照主分区创建副本。所有工作完成后,集群就会变成绿色状态(标示所有的主分区的索引副本都已经分配完成了)。

  探测是吧节点

  在正常工作时,主节点会监控所有节点,查看各个节点是否工作正常。如果在指定的时间里,节点无法访问,就呗视为出现故障了,接下来错误处理程序就会启动。集群需要均衡——由于该节点出现故障,分配到该节点的索引分片丢失。其实节点上相应的分区就会吧工作接管过来的这个过程可以通过配置满足用户需求。

  由于只是展示es的工作原理,就以下图三个节点的集群为例。集群中有一个主节点和两个数据节点。主节点想其他节点发送ping命令后等待回应。如果得到回应(实际上可能得不到恢复ping命令个数,取决于用户配置),改节点就会被移出集群。

  

  与es进行通讯

    归根到底,最重要的是如何往es中添加数据以及如何查询数据。es提供了api,这些api都是基于rest风格。而且这些api非常容易与其他能够处理http的系统进行集群。

    es为数据应该伴随在url中,或作为请求主体requst body。以一种json格式的文档发送给服务器。

    es内部,节点之间通讯解释用的先关javaapi。

  重点来咯

  索引数据

    es提供了4中索引数据的方法。最简单的就是索引api。通过它可以将文档添加到指定的索引中去。比如curl工具。我可以通过如下命令创建一个新的文档

    第2、3中方法,可以通过bulk API和UDP API批量添加文档。通常的bulk API采用HTTP协议,UDP bulk api采用非连接的数据包协议。UDP协议传输速度更快,但可靠性差点、最后一种是通过rivier插件。river运行在es集群的节点上,能够从外部系统中获取数据。

  有一点需要注意,索引数据的曹组只会发生在主分区上,而不会发生在分区副本上。如果索引数据的请求发送到节点上没有合适的分片或者分片副本,那么请求就会被转发到含有主分区的节点。

   数据查询

    查询api在es中有着很大的比重。通过query DSL(基于json,用于构造复杂的语言)

    使用类型查询:简单关键词、短语、区间、布尔、模糊、跨度、通配符、地理位置等查询方式。

    通过组合简单查询构造复杂的查询。

    过滤文档,去除不符合标准的文档而且不影响打分排序。

    查找给定文档的相似文档。

    查找给定短语的搜索建议和查询短语修正。

    通过faceting构建动态的导航和数据统计。

    使用prospective search而且找到匹配写定文档的查询语句(prospective search一种推送方式。用户的查询语句存储在索引中,如果新的文档添加到索引中,就把文档关联到匹配的查询语句中。这种适合于新闻,博客等定时更新的场景)。

关于数据查询,其核心在于查询过程不是一个简单、单一的流程。通过这个过程分为两个阶段:查询阶段和结果汇总阶段。在查询分发阶段,会从各个分支中查询数据;在结果汇总阶段,会从各个分群上查询到结果进行合并,排序等其他处理过程,然后返回给用户。

用户可以通过指定搜索类型来控制查询的分发和汇总过程。

  索引参数设置

    es索引参数会自动配置

    文档结构以及域类型会自动识别。当然es也允许用户自定修改默认配置。

比如,自行配置很多参数,比如通过mapping配置索引中的文档结构,设置分区shard和副本replica的个数,设置文本组件……

集群管理和监控

  通过管理和监控部分的api,用户可以更改集群设置。比如调整节点发现机制或更改索引的分片策略。用户可以查看集群状态信息,或者每个节点和索引和统计信息。集群监控的api非常广泛。

  强大的用户查询语言DSL

     if/idf打分公式

这个就是打分公式的真面目。如果只是为了调整查询语句之间的关联关系,用户不必去理解它的原理。但只搜啊要知道它是如何工作的。      

lucene概念上的打分公式

上面展示了布尔信息检索和向量空间信息检索模型的组合。(这个暂时忽略)

可以了解更多东西可以去这里

从es的角度看打分排序

  最重要的是利用lucene构建起来的es允许用户修改默认的打分算法。但es不仅仅是lucene的简单封装,因为es中,文档排序并非完全依赖apache lucene的打分算法。es实现了多种不同的查询类型,这些查询类型可以完全依赖与文档的打分计算方式,es允许通过脚本定制文档的打分方式。

查询重写机制

  如果你曾经使用过很多不同的查询类型,比如前缀查询和通配符查询,从本质上,任何的查询都可以视为对多个关键词查询。查询重写(query rewrite),es对用户查询进行了重写,这样做为了保证性能。重写过程是吧lucene角度认为原始的、开销大的查询对象转变成一系列开销小的查询对象的一个过程。

前缀查询:

  例如:

我是知道所有字符以j开头的文档。这个需求非常简单,在client索引上运行

查询结果的重打分

有些场景对查询语句的结果文档进行重新打分是很有必要的。重新打分的原因可能各有相同。

其中一个原因可能是处于性能考虑,比如对整个有序的结果集进行重排序开销会很大,通常就会只对结果集进行重排序。

理解重打分

在es中,重打分是一个对限定数目的查询结果进行再次打分的一个过程。这意味着es会根据新的打分规则对结果的前n个文档重新进行一次排序

 rescore query的结构:

  重打分的参数

    在查询语句的rescore对象中,用户可以添加如下参数

      window_size提供了与N个文档的相关信息。用于执行分片上用于重打分的文档个数

      query_weight默认1;原查询的打分会先乘以query_weight,然后与rescore的得分相加。

      rescore_query_weight默认1,rescore的打分会先乘该值,在与原查询的得分相加。

      rescore_mode默认tatal;在es0.90.0中引入用来指定重打分文档的打分方式。可选值:total,max,avg和multiply。

total:最终得分为原查询得分和rescore得分的和;

max,最终得分为原查询得分和rescore得分的最大值;

min,最终得分为原查询得分和rescore得分的最小值;

avg,最终得分为原查询得分和rescore得分的平均值;

multiply,两种查询的得分相乘。

例如设置recore_mode参数值为total,文档最终得分是

查询结果的排序

  当给es发送查询命令时,返回的文档集合默认会按照计算出来的文档打分排序。这个通常是

用户希望的:结果集中的第一个文档就是查询命令想要的文档。然而,有事我们希望改变这种排序

  

  

  

  

update API

    当往索引中添加新的文档到索引中时,底层的lucene工具包会分析每个域,生成token流

  token流过滤后得到倒排索引。在这个过程中输入文版中一系诶不必要的信息会丢掉。

  这些不必要的信息可能是一些特殊词的位置,一些停用的词或用同义词代替的词,或者词尾

  。这也是为什么无法对lucene中的文档进行修改,每次修改一个文档时,必须吧文档所有域   添加到索引中。es通过_source这个代理域来存储或检索文档中的真是数据。

  当我们想更新文档时,es会把数据放到_souce域中,然后做出修改,最后吧更新后的文档

  添加到索引中。让然前提是_source域的这项特性必须生效。文档更新命令只能更新一个文档

  查询命令的文档更新还没有出来。

  更新:

  

  使用update API创建或删除文档

  update API不仅可以修改某个域,同时也能操作整个文档。

  upsert特性使得在定位到一个不存在的文档是,它会被创建爱你出来:

  

  如果文档存在,该命令将重置year域中的值;否则会被创建。新的文档包含upset中定义的titile域。当然,上面的命令还有可以使用脚本:

  

   update还允许用户选择性的删除整个文档。

          

     filters优化查询:

    es支持多种类型的查询,但是查询那个匹配成功,哪个应该呈现给用户,查询并不是唯一的。es查询dsl允许用户使用绝大数查询都会有各自的标示。

  

  过滤器(filters)和缓存

    

 

时间: 2024-11-25 15:23:02

ES搜索引擎的相关文章

分享课程Scrapy分布式爬虫之ES搜索引擎网站

Scrapy分布式爬虫之ES搜索引擎网站 分享网盘地址--https://pan.baidu.com/s/1oAsW3Se 密码: tmtx 备用地址(腾讯微云):http://url.cn/51n4soD密码:SyRADx 大数据时代到来,信息更新非常快速,各行各业如果不与时俱进,都将面临优胜劣汰,知识是不断更新的,只有拥有一技之长,才能立于不败之地.网络爬虫,即Web Spider,是一个很形象的名字.目前爬虫开发语言的主要是python,本课程结合几个小的爬虫案例,帮助学员更好的学习爬虫.

ES搜索引擎集群模式搭建

一.简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎(与Solr类似),基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便. 二.相关概念 cluster 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点通过选举产生,主从节点是对于集群内部来说的.ES的一个

ES搜索引擎基本操作

一.创建索引库 执行:,索引库的名称为zhen 结果(我已经创建过了,重复执行会报错): 二.创建索引 1.添加索引 2.添加索引(动态添加新列) 3.添加指定id的索引[根据id可以直接修改一前的索引] 三.搜索 1.根据id搜索 2.根据字段搜索[每一个_source对应一条索引] 3.多条件组合搜索 [[email protected] ~]# curl -H "Content-Type: application/json" -XGET http://192.168.245.13

聊聊基于Lucene的搜索引擎核心技术实践

最近公司用到了ES搜索引擎,由于ES是基于Lucene的企业搜索引擎,无意间在"聊聊架构"微信公众号里发现了这篇文章,分享给大家. 请点击链接:聊聊基于Lucene的搜索引擎核心技术实践

郁金香搜索引擎的方案

先介绍学心理学的时候记住的两个把妹秘籍: 1>巴甫洛夫把妹法:巴甫洛夫的狗的反射试验上学的时候大家都应该学过,天天给狗喂食的时候摇铃,后来不喂食只摇铃狗还是分泌唾液.应用到把妹这个非常有实际意义的事情上面就是:每天给妹子送早晨,等人家形成了习惯,突然不送了,人家就开始觉得不自在了,开始各种想这个男孩纸~~ 2>吊桥效应:在吊桥上,由于危险的情境,人们会不自觉地心跳加快,错把由这种情境引起的心跳加快理解为对方使自己心动,才产生的生理反应,故而对对方滋生出爱情的情愫. 心理学是门很实用的学问吧[偷

Elasticsearch VS Solr

最近公司用到了ES搜索引擎,调研发现大公司常用的搜索引擎还有Solr. 鉴于 Lucene 强大的特性和稳定性,有很多种基于 Lucene 封装的企业级搜索平台.其中最流行有两个:Apache Solr 和 Elastic search. Apache Solr:它本身是 Apache Lucene 项目下的开源企业搜索平台,算是 Lucene 的直系.美团.阿里搜索服务是基于 Solr 来搭建的. Elastic Search:简称 ES,由 Elastic 公司开发.Elastic 成立于

继往开来-忆2015之工作篇

工作上的事情主要有两块,作为程序员立身之本的技术部分,以及随着工作逐渐增加的"管"理部分. 先谈技术. 技术方面成长主要体现在设计层面.上次的技术瓶颈出现在刚入职场时期,更多的是各种语言.工具的使用问题,比如:commons,hibernate,MyEclipse等等的使用.这次的瓶颈出现在程序设计方面,由于这一年里面出现了大量重复类似的需求,强迫自己不得不重新适应快速迭代的敏捷开发,使用更多的设计模式和工具来减轻日常的开发工作. 设计模式,15年开发应用了工厂.单例.责任链.策略等模式.这些应

关于ESearch的应用

ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例. 我在这里做一下简单介绍和整理: 首先.ES搜索引擎给予java开放使用之前必须安装java环境,使用jdk版本必须为1.7以上,网上下载ES的配置文件(启动bin文件中的elasticsearch批处理文件) 启动后网页访问:localhost:9200/_plugin/head/ 这样我们的搜索引擎就跑起来了,然后我们需要将数据库里面的数据灌入到这个搜索引擎里面,点击“Any Request[+]

数据库分库分表思路

一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间. 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位.整合.数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升