首页 > 知识内容详情
elasticsearch中文文档(ES(六) ElasticSearch搜索原理)

elasticsearch中文文档(ES(六) ElasticSearch搜索原理)

所属分类:知识

发布时间:2025-11-11 15:53:14

更新日期:2025-11-11 15:53:14

标签:

官方网址:

SEO查询: 爱站网 站长网 5118

进入网站
标签ad报错:该广告ID(3)不存在。
网站及网址申请收录 本站只收录合法内容
内容介绍

本文目录

ES(六) ElasticSearch搜索原理

关于ES的搜索,小白暂且简单的归纳如下:     新增文档时涉及分词、构建索引     查询时涉及分词、查询索引、相关度评分 那么接下来,小白就从分词、索引、相关度评分三个方面开始瞎掰了...     分词是指将文本转换成一系列单词(term or token)的过程,也可以叫做文本分析,在es里面称为Analysis。     分词机制:         Character Filter:对原始文本进行处理,例如 去除html标签、替换字符等         Tokenizer:将原始文本进行分词,例如 小白最帅 =》 小白,最,帅         Token Filters:分词后的关键字进行加工,例如 转小写、删除语气词、近义词和同义词等         在进行Tokenizer之前对对原始文本进行处理,例如 去除html标签、替换字符等         不过进行处理后,会影响后续Tokenizer解析的position和offset         HTML Strip         =》    去除html标签和转换html实体         Mapping             =》    字符串替换操作         Pattern Replace =》    正则匹配替换         将原始文本进行分词,例如 小白最帅 =》 小白,最,帅         Elasticsearch自带的分词器:       【分词器(Analyzer)】            【特点】         standard(es默认)                    支持多语言,按词切分并做小写处理         simple                                          按照非字母切分,小写处理         whitespace                                  按照空格来切分         stop                                             去除语气助词,如the、an、的、这等         keyword                                       不分词         pattern                                         正则分词,默认w+,即非字词符号做分割符         langua         单个term:_score(单) = idf(t) * tfNorm(t in d)         多个term:_score(多) = 多个_score(单)的和     最后,我们在Kibana中通过explain查询语句来看一哈【所用索引和数据为下一节中的内容】:ES(五) ElasticSearch+Kibana+IK 安装—ES集群                                          ES(七) Demo-商品搜索

Elasticsearch Analyzer详解

Elasticsearch 中文本分析Analysis是把全文本转换成一系列的单词(term/token)的过程,也叫分词。文本分析是使用分析器 Analyzer 来实现的,Elasticsearch内置了分析器,用户也可以按照自己的需求自定义分析器。 为了提高搜索准确性,除了在数据写入时转换词条,匹配 Query 语句时候也需要用相同的分析器对查询语句进行分析。

Analyzer 的组成 Analyzer 由三部分组成:Character Filters、Tokenizer、Token Filters

Character Filters

Character Filters字符过滤器接收原始文本text的字符流,可以对原始文本增加、删除字段或者对字符做转换。 一个Analyzer 分析器可以有 0-n 个按顺序执行的字符过滤器。

Tokenizer Tokenizer 分词器接收Character Filters输出的字符流,将字符流分解成的那个的单词,并且输出单词流。例如空格分词器会将文本按照空格分解,将 "Quick brown fox!" 转换成 。分词器也负责记录每个单词的顺序和该单词在原始文本中的起始和结束偏移 offsets 。 一个Analyzer 分析器有且只有 1个分词器。

Token Filters Token Filter单词过滤器接收分词器 Tokenizer 输出的单词流,可以对单词流中的单词做添加、移除或者转换操作,例如 lowercase token filter会将单词全部转换成小写,stop token filter会移除 the、and 这种通用单词,synonym token filter会往单词流中添加单词的同义词。 Token filters不允许改变单词在原文档的位置以及起始、结束偏移量。 一个Analyzer 分析器可以有 0-n 个按顺序执行的单词过滤器。

Elasticsearch内置的分词器 Standard Analyzer - 默认分词器,按词切分,小写处理 Simple Analyzer - 按照非字母切分(符号被过滤),小写处理 Stop Analyzer - 小写处理,停用词过滤(the ,a,is) Whitespace Analyzer - 按照空格切分,不转小写 Keyword Analyzer - 不分词,直接将输入当做输出 Patter Analyzer - 正则表达式,默认 W+ Language - 提供了 30 多种常见语言的分词器

常用的插件分词器 IK Analyzer - 对中文分词友好,支持远程词典热更新,有ik_smart 、ik_max_word 两种分析器 pinyin Analyzer - 可以对中文进行拼音分析,搜索时使用拼音即可搜索出来对应中文 ICU Analyzer - 提供了 Unicode 的支持,更好的支持亚洲语言 hanLP Analyzer - 基于NLP的中文分析器

ElasticSearch GeoLocation 官方文档翻译之 Geo Point

Geo-points 就是我们地球的经纬度,它能够用于计算地球两点之间的距离。 Geo-points 不能使用动态mapping,必须提前制定好geo_point类型 假设我们把 location 字段定义为geo_point 类型,我们创建文档的时候应该包含一对 latitude/longitude ,可以是 string ,arrays 或者 objects latitude/longitude 在每种类型的顺序是不一样的,在字符串中是"latitude,longitude",但是在数组中应为, 以前,字符串和数组中的经纬度顺序是一致的,但是为了和GeoJSON保持一致,所以讲数组的经纬度顺序颠倒了。 四种geo-point filters 可以帮助我们去过滤数据,当我们使用geolocation时。 geo_bounding_box: 找出落在一个指定的长方形中的geo-points geo_distance: 找出以一个点为中心,一个指定半径范围内的geo-points geo_distance_range: 找出以一个点为中心,设置一个最小半径和一个最大半径,在这个之间的geo-points geo_polygon: 找出落在一个多边形范围内的geo-points,这个代价是相当昂贵的,如果你有这样的需求,建议使用 geo-shapes 每种filter的计算一个点是否落到一个区域的方式有些不同,但过程都是相似的。 所请求的区域被转换为quad/geohash前缀标记的范围,然后去倒排索引中搜索具有相同标记的文档。 Geo-filters 是相当耗费性能的,它适合用于在文档数量较少的时候。首先,你应该利用其它filter先过滤掉一部分数据。 它是到目前为止最有效率的filter,因为他的计算非常简单。你只需提供上、下、左、右四个坐标,剩下的就是他会比较longitude 是否在左右坐标内,latitude 是否在上下坐标内 geo_bounding_box 是不需要将所有的geo-points都加载到内存的。因为它需要做的就是检查the lat and lon 是否落到了一个指定的区域。它可以用倒排索引去做个一次过滤。 为了使用这种优化,我们必须指定geo_point 的映射,设置 "lat_lon": true 现在,当你执行下面的查询时,我们会告诉elasticsearch使用lat 和lon的索引 geo_distance 这个过滤器会画个圆,来找到在这个落在这个圆内所有的文档 geo-distance 的搜索是相当耗费性能的,为了优化,elasticsearch会首先会画一个内切于圆的正方形。然后用bounding-box filter 过滤掉一部分数据。然后在执行geo-distance filter去找到那些落在圆内的数据。 两点之间的距离可以利用一个牺牲性能来提高精度的算法去计算 arc: 最慢但是精度最高的就是arc 了,一个把地球看成一个球体,但是精度还是有限的,因为实际上地球并不是一个真正的球体 plane: plane 算法把地球看成扁平的。它很快但是精度低。在赤道精度最高。 sloppy_arc: 这么称呼他是因为这个算法是粗滤的计算。 在查询的时候,你可以和下面一样,指定一个算法 geo_distance 和 geo_distance_range 的唯一区别是,geo_distance_range是一个圆环。 查询结果是可以跟到一个点的距离排序的 你可以问问你自己,为什么要指定距离单位,排序?这不取决于我们用米、千米而产生不同的结果。真是的原因是排序的时候会返回结果

企业级开源搜索引擎:Elasticsearch

Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene基础之上。但是Lucene只是一个工具类库,且接口较为复杂。你必须先理解搜索引擎的工作原理,才能有效利用Lucene。ElasticSearch通过隐藏Lucene背后复杂的搜索理论知识,预设了搜索引擎默认的参数,只需要最少的理解,就能快速搭建出搜索引擎,开箱即用。 1. 索引(Index) ElasticSearch的Index类似于关系型数据库的Database,用来存储各种类型的文档。一个索引应该是因共同的特性被分组到一起的文档集合。 以Google作为栗子,我们可以把Index理解为Google所抓取网页(文档)存储的地方。 2. 类型(Type) Type类似于关系型数据库的Table,用来存储相似文档的地方。 以Google作为栗子,我们可以把网页、图片、视频等不同类型的搜索,存放在不同的Type里面。 3. 文档(Document) Document类似于关系型数据库里面的Row,存储具体的一个对象。 ElasticSearch的文档是以JSON格式存储的。形如: 以Google作为栗子,一个网页就是一个文档。 4. 字段(Field) Field类似于关系型数据库的Column,存储某一个具体的属性。 以Google作为栗子,网页的标题(Title)就是一个字段。 注意: ElasticSearch的Type与传统关系型数据库的Table不一样的地方在于:同一个Index下的Type,名称相同的Field,类型要保持一致。 以Google作为栗子,当Google把网页类型的文档和图片类型的文档都存储在同一个Index下面时,假设网页和图片都有一个Title属性,那么在同一个Index下面,这两个属性的类型必须保持一致,比如必须都是String类型的。因为ElasticSearch更倾向于存储同构类型的文档。 下载安装包,并解压到/opt目录下 elasticsearch.yml文件 vim/opt/elasticsearch-2.4.4/config/elasticsearch.yml 启动项目 安装head插件 打开浏览器访问页面:http://192.168.204.151:9200/_plugin/head/

filebeat+elasticsearch+logstash+kibana收集系统日志(docker)

我们这里用到的是 filebeat+elk(elasticsearch+logstash+kibana) 来进行系统日志的收集。filebeat安装在各个服务器中,Logstash+ElasticSearch+Kibana安装在一台专门用于基础服务的服务器上。

Filebeat是一个轻量级的托运人,用于转发和集中日志数据. Filebeat作为代理安装在服务器上,监视您指定的日志文件或位置,收集日志事件,并将它们转发到 ElasticSearch Logsta

我这里安装的deb包(rpm包也同样),配置文件在 /etc/filebeat/filebeat.yml ,

filebeat命令:

参数介绍:

在/usr/local/文件夹下依次创建logstash/conf.d/logstash.conf

grok正则在线验证地址: http://grokdebug.herokuapp.com

正则代表的含义: https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

配置成功后,执行如下命令重启docker中的logstash (有时会重启失败,多试几次吧)

在浏览器中输入 http://ip:5601 进入kibana

然后如下设置

然后创建 index pattern

然后选择@timestamp

最后在Discover标签页就可以看到了

Elasticsearch

Elasticsearch是一个基于Lucene的实时分布式的搜索与分析引擎。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch都可以有效地存储和索引,以支持快速搜索。随着你的数据和查询量的增长,Elasticsearch的分布式特性使部署能够随着它而无缝增长。

Elasticsearch是一个 分布式文档存储 。Elasticsearch不是将信息存储为列式数据行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档会分布在整个集群中,并且可以从任何节点立即访问。

存储文档后,它会在近乎实时的情况下被索引并完全可搜索——1秒内。Elasticsearch使用一种称为倒排索引的数据结构,它支持非常快速的全文搜索。倒排索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。

索引是文档的优化集合,每个文档都是字段的集合,字段是包含数据的键值对。 默认情况下,Elasticsearch对每个字段中的所有数据进行索引,并且每个索引字段都有一个专用的优化数据结构。

Elasticsearch还具有无预定数据模式(schema-less)的能力,这意味着无需明确指定如何处理文档中可能出现的每个不同字段即可对文档进行索引。启用动态映射后,Elasticsearch会自动检测新字段并将其添加到索引中。只要开始索引文档,Elasticsearch就会检测并将布尔值、浮点和整数值、日期和字符串映射到适当的Elasticsearch数据类型。也可以定义规则来控制动态映射,明确定义映射以完全控制字段的存储和索引方式。

Elasticsearch提供了一个简单REST API,用于管理集群以及索引和搜索数据。可以直接从命令行、应用程序客户端或通过Kibana中的开发者控制台轻松提交请求。

Elasticsearch REST API支持结构化查询、全文查询和将两者结合的复杂查询。结构化查询类似于在SQL中构造的查询类型。全文查询查找与查询字符串匹配的所有文档,并按与搜索词的匹配程度对它们进行排序。

除了搜索单个术语之外,还可以执行短语搜索、相似性搜索和前缀搜索。可以使用 Elasticsearch全面的JSON样式查询语言 (Query DSL) 访问所有这些搜索功能。 您还可以构建SQL样式的查询以在Elasticsearch内本地搜索和聚合数据。

建议使用三个主节点三个数据节点集群,这里是演示

环境规划

Index modules

Index management

可以通过Kibana Management或ILM API创建和管理索引生命周期策略。当您为Beats或Logstash Elasticsearch输出插件启用索引生命周期管理时,默认策略是自动配置的。

索引生命周期阶段共分为五个阶段:

在为日志或指标等时间序列数据编制索引时,不能无限期地写入单个索引。 为了满足索引和搜索性能要求并管理资源使用情况,写入索引直到满足某个阈值,然后创建一个新索引并开始写入它。 使用滚动索引能够达到以下效果:

ILM能够根据索引大小、文档计数或年龄自动滚动到新索引。 当触发 Rollover 时,会创建一个新索引,写入别名会更新为指向新索引,所有后续更新都会写入新索引。

索引生命周期操作

配置生命周期策略

启动和停止索引生命周期管理

命令使用均已运行用户执行

elasticsearch-keystore 命令管理 Elasticsearch 密钥库中的安全设置。

elasticsearch-node命令能够在节点上执行某些不安全的操作,这些操作只能在关闭时执行。 此命令允许您调整节点的角色,不安全地集群设置,并且即使在与磁盘上的数据不兼容的情况下,也可以在灾难后恢复某些数据或启动节点。

创建、列出和删除基于文件的服务账户令牌。当创建第一个服务帐户令牌时,此命令会在 $ES_HOME/config 目录中创建一个 service_tokens 文件。 该文件默认不存在。Elasticsearch监视此文件的更改并动态重新加载它.

设置内置用户的密码。此命令仅供在Elasticsearch安全功能的初始配置期间使用。 它使用弹性引导密码来运行用户管理API请求。 如果Elasticsearch密钥库受密码保护,则必须先输入密钥库密码,然后才能为内置用户设置密码。 为弹性用户设置密码后,引导密码不再有效,无法使用该命令。

在某些情况下,分片副本的Lucene索引或事务日志可能会损坏。 elasticsearch-shard命令能够在无法自动恢复或从备份恢复的分片的良好副本时删除分片的损坏部分。运行elasticsearch-shard时,将丢失损坏的数据。在运行elasticsearch-shard之前停止Elasticsearch。

使用基于文件的用户身份验证,则可以使用elasticsearch-users命令添加和删除用户、分配用户角色和管理密码。

参考官方文档 REST APIs

快照是从正在运行的Elasticsearch集群中获取的备份。 可以拍摄整个集群的快照,包括其所有数据流和索引。 还可以仅对集群中的特定数据流或索引进行快照。必须先注册快照存储库,然后才能创建快照。

Elasticsearch以增量方式进行快照:快照过程只将数据复制到存储库中,而之前的快照还没有复制到那里,避免了不必要的重复工作或存储空间。这意味着可以安全地以最小的开销频繁地进行快照。这种增量只适用于单个存储库,因为存储库之间没有数据共享。快照在逻辑上也是相互独立的,即使是在一个存储库内:删除一个快照不会影响任何其他快照的完整性。

可以将快照恢复到正在运行的集群中,默认情况下包括快照中的所有数据流和索引。 也可以选择仅从快照恢复集群状态或特定数据流或索引。

可以使用快照生命周期管理来自动拍摄和管理快照。

快照包含构成索引或数据流支持索引的磁盘上数据结构的副本。这意味着快照只能被恢复到可以读取索引的Elasticsearch版本中。版本兼容图如下:

Elasticsearch 倒排索引

之前我们已经了解过,Elasticsearch 是一个基于 Lucene 实现的分布式全文检索引擎,其实 Elasticsearch 倒排索引就是 Lucene 的倒排索引。数据检索是 ES 的一项核心功能,它的底层实现也是离不开倒排索引的,通过倒排索引技术可以提高数据的检索效率,理解倒排索引的原理很重要。 那什么是倒排索引,我们该如何理解它呢? 我们能进行数据检索的前提条件是,已经创建好了索引库,并给里边添加了文档数据。所以我们可以按照 创建索引库 、 添加文档 、 数据检索 这个顺序来认识倒排索引。 首先是创建索引库,我们之前已经安装好了 IK 分词器,这里我们创建一个 test 索引,它只有一个 content 字段,添加文档时字段的分词模式是 ik_max_word ,检索时关键字的分词模式是 ik_smart : 字段的分词模式会影响最终生成的倒排索引。不了解分词器的可以参考 Elasticsearch 中文分词器插件 。 创建好了索引,我们来添加一条文档数据: 添加文档数据时,ES 会根据字段的分词模式将字段的值拆分成多个 词条 (Term)(或者称作词项),创建索引库时我们指定了 content 字段分词模式为 ik_max_word ,则会生成如下的词条: 接下来就是建立倒排索引了,在这之前我们先了解两个概念 词条字典 (Term Dictionary)、 倒排列表 (Posting List): ES 的倒排索引就是由 词条字典 和 倒排列表 两部分组成的。如下就是一个简易版的倒排索引,倒排列表项只有词条对应的文档 id: 一个词条对应一个倒排索引项。ES 会给每个字段都建立一个倒排索引。 我们再添加一条文档数据: 根据上边的原理,最终 content 字段的倒排索引会被更新成如下结构: 前边已经添加了文档数据,同时也生成了倒排索引,接下来就是检索数据了。在这之前还有一个知识点需要了解,那就是 词条索引 (Term Index),词条索引一般只存储各个 词条 的前缀(第一个字符),它和字条字典对应。之所以需要词条索引,是因为 词条字典 一般都很大,不适合保存在内存中而是存储在磁盘中,检索数据时根据关键字的前缀匹配到词条索引,再根据词条索引定位到关键字在倒排索引的词条字典中大致的位置,然后进一步在词条字典中通过二分查找定位到具体的词条,这样避免了直接遍历词条字典来点位词条,大幅减少了磁盘的读取,提高了效率。 定位到了词条,就能在倒排索引中找到对应的倒排列表项,进而就知道了对应的文档 id,有了文档 id 自然也就找到了文档,这也就是 ES 检索数据大致的原理。 如下我们查询包含 十二 的文档数据: 由于我们创建索引库时指定了检索时关键字的分词模式是 ik_smart ,所以 十二 被分词后还是 十二 ,再结合上边的原理,以 十二 为关键字最终可以查询到 id 为 1、2 的文档数据:这篇最好能结合 Elasticsearch 中文分词器插件 一起看,这样能更容易理解些。 新手上路,不合理的地方还望大佬指点。

推发布温馨提示:

"elasticsearch中文文档(ES(六) ElasticSearch搜索原理)"浏览人数已经达到,如你需要查询该内容或者官方网站 的相关权重及百度收录信息,可以点击爱站网"爱站数据"站长之家网"Chinaz数据"进入;5118"进入查询更多!

以目前的网站数据参考,建议大家请以爱站数据为准,更多网站价值评估因素如:访问速度、搜索引擎收录以及百度收录索引量、用户体验等;当然要评估一个站的价值,最主要还是需要根据您自身的需求以及需要,一些确切的数据则需要找的站长进行洽谈提供,如该内容百度收录情况及官方网站的IP、PV、跳出率等!


互联网 tuifabu.com 文章内容百度收录查询
当你在网上看到elasticsearch中文文档(ES(六) ElasticSearch搜索原理)标题时,推发布尽可能为你提供更多关于elasticsearch中文文档(ES(六) ElasticSearch搜索原理)的内容及elasticsearch中文文档(ES(六) ElasticSearch搜索原理)文章,你还可以在百度进行elasticsearch中文文档(ES(六) ElasticSearch搜索原理)关键词搜索相关内容文章进行查询你想要的信息!

推发布免责声明:

你所看到的关于elasticsearch中文文档(ES(六) ElasticSearch搜索原理)内容都来源于网络,不保证外部链接及内容的一定准确性和完整性,同时,对于该外部链接的指向,不由本站实际控制,在2025-11-11 15:53:14收录时,该网页上的内容,都属于合规合法,后期网页的内容如出现违规,可以直接联系网站管理员进行删除,本站不承担任何责任。