Ⅰ Elasticsearch是什么
Elasticsearch是一个分布式文档存储。Elasticsearch存储的是序列化为JSON文档的复杂数据结构,而不是以列行数据的形式存储信息。当集群中有多个Elasticsearch节点时,存储的文档分布在整个集群中,可以立即从任何节点访问。
当存储文档时,它几乎是实时的——在1秒内就可以被索引和完全搜索。Elasticsearch使用了一种名为反向索引的数据结构,它支持非常快速的全文搜索。反向索引列出任何文档中出现的每个惟一单词,并标识每个单词出现的所有文档。
可以将索引看作是文档的优化集合,每个文档是字段的集合,这些字段是包含数据的键值对。默认情况下,Elasticsearch对每个字段中的所有数据进行索引,每个索引字段都有一个专用的、优化的数据结构。例如,文本字段存储在倒排索引中,数字和地理字段存储在BKD树中。使用每个字段的数据结构来组装和返回搜索结果的能力是Elasticsearch如此快速的原因
Elasticsearch还具有无模式的能力,这意味着可以对文档进行索引,而不必显式地指定如何处理文档中可能出现的每个不同字段。当动态映射被启用时,Elasticsearch会自动检测并向索引添加新的字段。这种默认行为使得创建索引和浏览数据变得很容易——只要开始创建索引文档,Elasticsearch就会检测布尔值、浮点值和整数值、日期和字符串,并将它们映射到合适的Elasticsearch数据类型。
但是,最终,您比Elasticsearch更了解您的数据以及您想如何使用它。您可以定义规则来控制动态映射,并显式地定义映射来完全控制字段的存储和索引方式。
定义您自己的映射使您能够:
为不同的目的以不同的方式为同一个字段建立索引通常是很有用的。例如,您可能希望将字符串字段索引为全文搜索的文本字段和用于排序或聚合数据的关键字字段。或者,您可以选择使用多个语言分析器来处理包含用户输入的字符串字段的内容
在索引期间应用于全文字段的分析链也在搜索时使用。当查询全文字段时,在索引中查找术语之前,查询文本会进行相同的分析。
虽然您可以使用Elasticsearch作为文档存储和检索文档及其元数据,但它的真正强大之处在于能够轻松访问构建在Apache Lucene搜索引擎库上的全套搜索功能。
Elasticsearch提供了一个简单、一致的REST API,用于管理集群、索引和搜索数据。出于测试目的,您可以直接从命令行或通过Kibana中的Developer Console轻松地提交请求。在应用程序中,您可以使用Elasticsearch客户端来选择语言:Java、JavaScript、Go、. net、PHP、Perl、Python或Ruby。
Elasticsearch REST api支持结构化查询、全文查询和结合这两种查询的复杂查询。结构化查询类似于您可以在sql中构造的查询类型。例如,您可以在雇员索引中搜索性别和年龄字段,并根据hire_date字段对匹配项进行排序。全文查询查找与查询字符串匹配的所有文档,并根据相关度(它们与搜索词的匹配程度)返回它们。
除了搜索单个术语外,您还可以执行短语搜索、相似度搜索和前缀搜索,并获得自动补全建议。
是否有想要搜索的地理空间数据或其他数字数据?Elasticsearch在优化的数据结构中对非文本数据进行索引,支持高性能的地理和数字查询。
您可以使用Elasticsearch的全面的json风格的查询语言(query DSL)访问所有这些搜索功能。您还可以构造SQL风格的查询来在Elasticsearch内部本地搜索和聚合数据,JDBC和ODBC驱动程序允许许多第三方应用程序通过SQL与Elasticsearch交互。
Elasticsearch聚合使您能够构建复杂的数据总结,并洞察关键指标、模式和趋势。不只是寻找众所周知的“大海捞针”,聚合使您能够回答这样的问题:
您还可以使用聚合来回答更微妙的问题,例如
因为聚合利用了用于搜索的相同数据结构,所以它们也非常快。这使您能够实时分析和可视化数据。您的报告和仪表板会随着数据的更改而更新,因此您可以根据最新的信息采取行动。
What’s more, aggregations operate alongside search requests. You can search documents, filter results, and perform analytics at the same time, on the same data, in a single request. And because aggregations are calculated in the context of a particular search, you’re not just displaying a count of all size 70 needles, you’re displaying a count of the size 70 needles that match your users' search criteria—for example, all size 70 non-stick embroidery needles
Elasticsearch始终可用,并可根据您的需求进行扩展。它通过自然分配来做到这一点。您可以将服务器(节点)添加到集群中以增加容量,Elasticsearch会自动将您的数据和查询负载分布到所有可用的节点上。Elasticsearch不需要彻底检查应用程序,它知道如何平衡多节点集群以提供规模化和高可用性。节点越多越快乐
这是如何工作的呢?实际上,Elasticsearch索引只是一个或多个物理碎片的逻辑分组,其中每个碎片实际上是一个自包含的索引。通过将索引中的文档分布到多个分片上,并将这些分片分布到多个节点上,Elasticsearch可以确保冗余,既可以防止硬件故障,又可以随着节点添加到集群中而增加查询容量。随着集群的增长(或收缩),Elasticsearch会自动迁移碎片来重新平衡集群
有两种类型的分片:基本分片和复制分片。索引中的每个文档都属于一个主分片。复制分片是主分片的副本。副本提供数据的冗余副本,以防止硬件故障,并增加服务读取请求(如搜索或检索文档)的容量。
索引中主分片的数量在索引创建时是固定的,但是复制分片的数量可以在不中断索引或查询操作的情况下随时改变。
关于分片大小和为索引配置的主分片数量,有许多性能方面的考虑和权衡。碎片越多,维护这些索引的开销就越大。碎片的大小越大,当Elasticsearch需要重新平衡集群时,移动碎片所需的时间就越长。
查询大量的小分片可以使每个分片的处理速度更快,但是查询越多意味着开销越大,因此查询少量的大分片可能会更快。总之,这要看情况。
为您的用例确定最佳配置的最佳方法是通过使用您自己的数据和查询进行测试。
出于性能原因,集群内的节点需要位于同一个网络上。在不同数据中心的节点之间平衡集群中的分片花费的时间太长了。但是高可用性架构要求您避免把所有鸡蛋放在一个篮子里。当一个位置发生重大故障时,另一个位置的服务器需要能够接管。无缝。答案吗?Cross-cluster复制(CCR)。
CCR提供了一种从主集群自动同步索引到可作为热备份的辅助远程集群的方法。如果主集群故障,辅助集群可以接管。您还可以使用CCR创建辅助集群,以服务于与用户地理位置相近的读请求。
跨集群复制是主备复制。主集群上的索引是活动领导索引,并处理所有写请求。复制到次要集群的索引是只读的追随者。
与任何企业系统一样,您需要工具来保护、管理和监视您的Elasticsearch集群。安全、监控和管理特性集成到Elasticsearch中,使您能够使用Kibana作为管理集群的控制中心。数据汇总和索引生命周期管理等特性可以帮助您随着时间的推移智能地管理数据
Ⅱ 如何用Elasticsearch实现类似SQL中的IN查询实例
嘿嘿,朋友你走运咯。正好昨天帮我朋友也解决了这个问题。我说的是C#下哈。首先你可以借助一个中间变量,Dictionary键值对,通过键值存放该窗体。然后在那个按钮的点击时间下判断这个键是否存在,如果存在就调窗体的Activate();方法,不存在的话就把他存到集合里面并且掉他的ShowDialog();我给你点代码提示。if(UserHelp.Forms.Keys.Contains("自己随便定义")==false){Form2f=newForm2();f.MdiParent=this;UserHelp.Forms.Add("自己随便定义",f);//存到集合f.Show();return;}if(UserHelp.Forms.Keys.Contains("自己随便定义")){if(UserHelp.Forms["自己随便定义"].WindowState==FormWindowState.Minimized)//如果窗体是最小化就让他变正常UserHelp.Forms["自己随便定义"].WindowState=FormWindowState.Normal;UserHelp.Forms["自己随便定义"].Activate();//得到焦点}记住在子窗体的关闭时间里把他从集合里面移除。
Ⅲ elasticsearch可以代替NoSQL吗
elasticsearch可以代替NoSQL吗
优点:
1.高并发。实测es单机分配10g内存单实例,写入能力1200qps,60g内存、12核CPU起3个实例预计可达到6000qps。
2.同机房单条数据写入平均3ms(比mysql慢,mg不清楚)
3.容错能力比mg强。比如1主多从,主片挂了从片会自动顶上
4.满足大数据下实时读写需求,无需分库(不存在库的概念)。
5.易扩展。实例间做下配置即可扩展并发性和容积,自动分配的写入机制,无需操心传统db中多主同步的诟病
6.支持较复杂的条件查询,group by、排序都不是问题
Ⅳ 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 moles
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版本中。版本兼容图如下:
Ⅳ “日记”ElasticSearch7.x新功能介绍
说明:ElasticSearch7.X很多新功能主要基于lucene8.X新特性,故对于lucene8.X新特性不赘述。
在6.1中已加入这个功能,但是默认是关闭的,在7.0中开始默认开启。若有两个节点,且其中一个节点上有一个索引的主分片,另一个节点上有同一个索引的副本分片,在6.X中关闭此特性时,不管每个节点状态如何,是否在做耗时操作,如GC等,每次请求过来时,都会通过轮询的方式访问两个分片其中之一;而在7.X开启后,ES会统计每次请求耗时,根据每个节点访问响应的耗时长度,对每个节点的访问频次进行自动调整。
Elasticsearch 7.0 中若分片在30秒内无请求访问,则分片进入"search idle"状态。一旦进入此状态且分片所在索引没有明确设置refresh间隔时间的(默认每秒执行),则定时的refresh停止直到下一个访问请求达到才进行下一次的refresh,在此期间相比原来,将明显增强索引数据的吞吐。如果明确设置了refresh间隔时间,则仍按配置中的间隔时间进行调度执行。
Elasticsearch5.3中发布了跨集群搜索(cross-cluster search)功能,供用户跨多个集群进行查询,如本地协调节点去访问多个不同机房的ES集群查询日志信息等。Elasticsearch 7.0中引入ccs_minimize_roundtrips执行模式可以减少一次请求来回的网络开销。
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.x/moles-cross-cluster-search.html
Elasticsearch 6.x 及之前的版本使用名为 Zen Discovery 实现,存在一些缺点,如选主时间较慢(秒级)、部分配置存在易于错配等情况。
Elasticsearch 7重新设计了集群协调子系统,移除了minimum master nodes设置,由集群自己选择可以形成法定数量的节点。并且新的子系统可以在很短时间内(亚秒级)完成选主。
Elasticsearch 7.0新增加了一个熔断器,更好的追踪内存使用量,准确地根据内存用量去拒绝客户端请求,避免节点异常;另外聚合操作返回的bucket限制为10000以内。
在 Elasticsearch 6.5中作为beta功能引入,6.7、7.X中GA,可以用在跨机房、跨地区情况下的集群数据同步。在这个版本中加入了一些监控的特性,解决了一些例如主从同步异常的问题。
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.6/ccr-getting-started.html
索引生命周期管理(Index Lifecycle Management)作为一个beta特性在6.6发布,在7.0GA。索引生命周期管理现在可以管理frozen indices,他作为其cold阶段的一部分;也可以对其管理的索引使用CCR功能。
frozen indices详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/frozen-indices.html
ILM详情: https://www.cnblogs.com/sanzxcvbnm/p/12083735.html ; https://www.jianshu.com/p/94e37a5b0878?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
Elasticsearch SQL可以让用户能够使用SQL进行交互查询Elasticsearch中索引数据。该功能在Elasticsearch 6.3中作为alpha版本引入,目前在Elasticsearch 6.7和7.0中也能够生产使用。 通过 Elasticsearch REST endpoints 、 Elasticsearch SQL command line interface 、 JDBC driver 、 ODBC driver 可以使用es sql。
从Elasticsearch 7.0.0开始,High-level REST Client(HLRC)API的所有功能已经宣布完成。原来TransportClient使用者可以计划将TransportClient迁移到HLRC。
Elasticsearch 7.0.0引入了JDK8原生时间库,可以处理纳秒精度时间戳。
JDK11可以支持TLS1.3,所以如果使用JDK11,那在es中可以选择使用TLS1.3.另外TLS1.0被移除,使用老版本jdk的可以选择使用TLS1.1或者1.2。
内置了OpenJDK,使得上手起来更加快速。
在日志目录下,我们会看到有.json拓展的日志。这便于我们使用类似jq的工具去查看日志,同时也在日志中加入了许多额外结构化信息,例如node.id, cluster.uuid, type。
这是lucene8中的重要版本功能更新。在之前的版本中,查询会计算所有命中的文档,但是用户经常查询 'a' , 'the' 等词汇,这种词汇不会增加多少文档得分,但迫使查询过程为大量的文档进行打分。
因此,如果检索结果只需要返回 TOP-K 的结果,而非范围准确的命中数量,可以对此进行优化,Lucene 8 中引入了 WAND 算法来实现此特性。当检索结果小于指定的结果总数时,该优化不会生效。
在停止计算命中文档总数之后,查询 QPS 得到大幅提升,以下结果来自 lucene 官方基准测试
Bool AND 查询,提升 2.3 倍左右。
Bool OR 查询,提升 2.5 倍左右。
Term 查询,提升 40 倍左右。
在 Elasticsearch 7中,要在查询中返回 TOP-K 的结果,通过 track total hits 参数来指定,默认值为10000,根据自己的需要设置返回前 K 个命中结果,或者设置为 true,返回全部命中结果数量。
计算 TOP-K 的过程中需要评估文档的最大得分,这需要在索引过程中写入一些额外的信息。Lucene 将词典划分一个个的 block,并构建了一个跳跃表,在查询的时候跳过不匹配的文档,现在,索引过程中会为每个块中最高影响(impacts)的摘要添加到该跳表中,可以计算出该块可能产生的最大得分,如果该得分不具有竞争力,则可以跳过它。更多信息可以阅读 此处 。
Elasticsearch 7.0 中新增了两个数据类型: rank_feature and rank_features 。他们只作用于数值型数据,且底层实现上可以利用上面top hits的特性。故可以看作是function score简化出的一个功能,利用他们可以对排序打分进行干预且查询效率更快。更多可以看以下详情: https://www.elastic.co/cn/blog/easier-relevance-tuning-elasticsearch-7-0
别名function score2。拓展性更佳,可以支持多种脚本语言及java插件,function score原有功能也都可以支持。详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.0/query-dsl-script-score-query.html
在ElasticSearch7.2+后关闭状态的索引也可以进行分片复制,以便于后面集群异常时可以成为主分片,或者进行数据恢复。
可以作于搜索联想功能,用户输入部分查询词后,返回联想词列表。与Completion suggester和Context Suggester功能大部分重复,但两者有不同的底层实现,search_as_you_type可以利用到最新top hits的特性,而suggester底层使用FST数据结构。之所以重新开发了一个数据字段,原因归结为:新数据字段更有利于占用更少的内存开销;新数据字段功能拓展性更加,可以用在普通的query语句中,结合其他filter等语法。
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.6/search-as-you-type.html ; https://github.com/elastic/elasticsearch/issues/33160 ; https://stackoverflow.com/questions/42127894/whats-the-difference-between-search-as-you-type-and-context-suggester
只能作用于date, date_nanos, 及 geo_point数据类型的字段。可以放置于query语法中,在查询中过滤不符合范围的时间或者距离,查询语法中需要设置origin(即初始的时间节点或者经纬度)。
一个只能在选举时投票而不能成为主节点的角色被引入了,这有助于高可用,且相对于主节点,这些节点只需要消耗非常少量的CPU和内存开销。
新的 Analyzer reload API 允许去修改运行时的分析器及其相应资源。例如,在之前版本中,重载同义词需要先关闭索引,再打开索引。使用这个api就不需要再关闭索引了。
通过这个字段可以直接索引json数据。仅为整个JSON对象创建一个字段映射,这可以帮助防止由于大量不同的字段映射而导致 映射爆炸 。
详情: https://blog.csdn.net/UbuntuTouch/article/details/103713730
有两种字段类型: sparse_vector 和 dense_vector ,用于计算和查询向量之间的余弦相似度和点积。
如题。
仅限于设置为只读的别名索引可以同步,write索引不可以同步。
如题。
在ElasticSearch6.X中,使用 Terms Aggregation会占用更多的内存,此版本进行了优化,降低内存消耗压力。
使用无监督的异常检测算法分析索引中每条doc的数值型字段,并在每条doc中记录一个异常值,以比较彼此之间的异常差异。提供 evaluate data frame analytics API ,以获取在算法使用期间的一些指标数据。
它会聚合出在特定字段中很少出现的字段值。计划使用它去替换terms aggregation中的"order" : { "_count" : "asc" }配置项。
提供新接口 pinned query ,可以指定排在返回结果前列的docs,适用于需要使用引导数据的场景。
支持AdoptOpenJDK 13,并将其打包在ES包中。
如果查询是以_search结尾,那么当对端连接被关闭后,查询也会被中止。
通过这个字段可以在es插入一个几何范围,即每条doc都是通过一串坐标点定义的几何范围,而通过shape query结合relationship配置,可以对每条doc计算是否是包含、相交等等关系,并将符合条件的取出。
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.x/query-dsl-shape-query.html ; https://blog.csdn.net/wjzt7322/article/details/103385560 ;
增加了一个新的圆形预处理,把圆形定义的几何图形转化为一个近似的规则几何,便于查询、聚合、索引等操作。图形如下:
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.x/ingest-circle-processor.html
现在直方图和日期直方图将支持范围字段,例如用其去计算特定时间段内的电话数等。
如题。
Elasticsearch 5.x版本中引入了Ingest Node的概念(预处理节点),它使得Es在事实上具备了Logstash的部分功能,即对索引数据的预处理。
在7.5增加了一个新的ingest processor,它可以使得新数据索引时从原有其他索引中抽取字段数据丰富正在插入的doc。
详情: https://www.felayman.com/articles/2017/11/24/1511527532643.html ; https://blog.csdn.net/UbuntuTouch/article/details/103400061
新的快照生命周期管理功能,允许用户设置定时策略去删除老的索引。
新增暂停和恢复接口,使用户可以临时暂停自动复制的模式
分类分析是一个有监督的机器学习算法,可以预测离散的分类值。在Es中可以进行二分类的算法执行,即将数据分为两个可能的类别。
详情: https://www.elastic.co/guide/en/machine-learning/7.x/dfa-classification.html
暂略( https://www.elastic.co/guide/en/elasticsearch/reference/7.x/histogram.html )
新版本lucene对这方面进行了重构,重构后也能在排序时过滤在打分上没有竞争力的文档(类似top hits),在查询效率上提升至少10倍。
ElasticSearch 7.2.0中引入,现在GA。 Transforms and Transform APIs 提供给我们一个能力,即指定索引中不同字段进行聚合,并将聚合结果索引入一个新建索引中(聚合结果中可以产生出其他新的字段,如同类型字段值的出现数量等),在这个过程中我们可以通过管理接口进行管理,每次聚合结果索引入新索引后,原索引中都会有一个checkpoint,故后面可以继续做批量聚合。
详情: https://www.elastic.co/guide/en/elasticsearch/reference/7.x/transforms.html
参考资料:
https://gitbook.cn/gitchat/column/5ce4ff9a308dd66813d92799/topic/5d47cfa4cb702a087ef8b77b
https://blog.csdn.net/UbuntuTouch/article/list/1
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/release-highlights-7.3.0.html
Ⅵ elasticsearch基本查询笔记(三)-- es查询总结
term 查询是简单查询,接受一个字段名和参数,进行精准查询,类似sql中:
ES中对应的DSL如下:
在ES5.x及以上版本,字符串类型需设置为keyword或text类型,根据类型来进行精确值匹配。
当进行精确值查询,可以使用过滤器,因为过滤器的执行非常快,不会计算相关度(ES会计算查询评分),且过滤器查询结果容易被缓存。
bool过滤器组成部分:
当我们需要多个过滤器时,只须将它们置入 bool 过滤器的不同部分即可。
terms是包含的意思,如下:
name包含["奥尼尔","麦迪"]
返回结果:
range查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式,可供组合的选项如下:
类似sql中的范围查询:
ES中对应的DSL如下:
如下sql,age不为null:
ES中对应的DSL如下:
如下sql,age为null:
ES中对应的DSL如下:
注:missing查询在5.x版本已经不存在。
匹配包含 not analyzed(未分词分析)的前缀字符:
匹配具有匹配通配符表达式( (not analyzed )的字段的文档。 支持的通配符:
1) * 它匹配任何字符序列(包括空字符序列);
2) ? 它匹配任何单个字符。
请注意,此查询可能很慢,因为它需要遍历多个术语。
为了防止非常慢的通配符查询,通配符不能以任何一个通配符*****或 ? 开头。
正则表达式查询允许您使用正则表达式术语查询。
举例如下:
注意: * 的匹配会非常慢,你需要使用一个长的前缀,
通常类似.*?+通配符查询的正则检索性能会非常低。
模糊查询查找在模糊度中指定的最大编辑距离内的所有可能的匹配项,然后检查术语字典,以找出在索引中实际存在待检索的关键词。
举例:
检索索引test_index中,type为user的全部信息。不过在 es6.x 版本,一个index仅有一个type,未来 es7.x 版本,将取消type,所以这个查询没啥意义。
返回指定id的全部信息。
全文检索查询,是通过分析器,对查询条件进行分析,然后在全文本字段进行全文查询。
全文搜索取决于mapping中设定的analyzer(分析器),这里使用的是ik分词器。
所以在进行查询开发时候,需要先了解index的mapping,从而选择查询方式。
匹配查询接受文本/数字/日期类型,分析它们,并构造查询。
对查询传入参数进行分词,搜索词语相同文档。
match_phrase查询分析文本,并从分析文本中创建短语查询。
用户已经渐渐习惯在输完查询内容之前,就能为他们展现搜索结果,这就是所谓的即时搜索(instant search) 或输入即搜索(search-as-you-type) 。
不仅用户能在更短的时间内得到搜索结果,我们也能引导用户搜索索引中真实存在的结果。
例如,如果用户输入 johnnie walker bl ,我们希望在它们完成输入搜索条件前就能得到: Johnnie Walker Black Label 和 Johnnie Walker Blue Label 。
match_phrase_prefix与match_phrase相同,除了它允许文本中最后一个术语的前缀匹配。
Ⅶ 5.ElasticSearch数据写入与删除
shard=hash(routing)%number_of_primary_shards;
一个索引有多个分片组成,多个分片数据组成了所有数据。当数据写入时,路由选择写入到那个分片,优先写入到主分片,然后再写入到副本分片。路由计算默认是基于数据id,也可以自己指定。
数据先写入缓存buffer里面,同时还要写一个事务日志,做持久化,高可用,防止节点突然出现故障,造成数据丢失。当达到一定阈值时,将缓存buffer中的数据写入到文件系统segment中。
可以使用PUT/POST,数据不存在则插入,存在则更新。也可以使用 _create /_ update , _create数据存在则报错,__update数据不存在则会报错。
2.1 常用请求参数
routing: 指定路由
refresh: 是否立即刷新 ,取值true/false,对于实时性要求比较高可以设置为true
wait_for_active_shards: 写入数据等待多少分片响应
version: 并发版本号
op_type: 操作类型,是create还是update
2.2 响应参数
_id : 数据唯一 id
result : created/updated
version: 数据版本号
seq_no:索引更新顺序号,每对索引进行更新操作,则进行自增。如果更新值与原数据值一样则不进行自增。
primary_term:主分片版本号
2.3 批量写入
单条写入性能差,批量效率更高,可以使用bulk关键字,进行批量写入。批量写入无事务保证,可能会局部成功,局部失败。重试机制由客户端保障。注意书写格式。
查询总条数使用参数:track_total_hits
3. 数据删除
3.1 单条删除
3.2批量删除
3.3条件删除
_delete_by_query:条件删除关键字
requests_per_second 控制每秒删除的数据条数,默认是-1,无限制,当数据量很大,需要删除的数据很多,es使用单线程需要删除很长时间,不建议这样做。设置每秒500~1000左右比较合适。
删除响应:
slice:切片,指定切片id和删除操作批次进行删除
可以使用 slices,它可以自动进行删除。指定一个数值N,es它会创建N个线程进行删除,N的最大值为分片数。
上面的语句会一次查询很多数据,可以使用scroll_size来指定每次查询的条数。它是采用快照查询,设置快照查询大小,控制每次查询数据量。
es大量删除数据,是通过异步任务进行删除,可以通过接口查看正在执行的任务。
Ⅷ ElasticSearch 使用详解:组合查询怎么玩
查询是一个复杂过程,特别是当查询过程中有多个条件,在 ES 中当有多个条件的时候,就得使用组合查询了。
组合查询是通过 bool 关键字来实现的,通过 must 、 must_not 、 should 将不同的条件组合到一起,再用 bool 包裹一下作为一个整体。用来实现各种且、非、或的条件组合。
给定需求:
下面的查询语句中不难看出,bool 包裹了条件整体,使用 must 组合两个条件实现了“且”。
给定需求:
下面这条查询语句,使用 must_not 不难理解是对里面的条件做了一个“非”操作。首先使用 match Phrase 查询姓名中包含 deng 的,然后再用范围查询,查询年龄小于 16 的,再取个“非”,达到了我们想要的效果。
给定需求:
因为性别是确定的字符串,要么是 man 要么是 female,所以这是一个精确值查询的需求,因此使用 term 查询,并且因为是 sex 的字段类型是“字符串”所以加上 keyword。(这里思考一下,上个课时中说了如果不加 keyword 将不会返回查询结果,但是这里如果把 keyword 去掉也能查询相同的数据,请问是为什么?结合上节课对 keyword 的解释,你一定会找到答案的。)
对于性别的过滤这里使用了两个 term 查询,但是是对同一个字段做出的判断,写两个 term 查询条件显得比较繁琐,这里对于同一个字段的条件判断有更简洁的写法,就是把条件放到数组中去。
这里有两个地方需要注意,第一就是 terms 而不是之前的 term,第二个就是字段后面加的是数组,而不是之前的花括号。
这里一定要注意,ES 中的条件组合跟 SQL 的逻辑稍微有点不同, ES 中 must 与 should 不能够同时使用,当使用了 must 后, should 将不会在发生作用 。
因为 should 只是一个增加相关性分数的一个条件,当你只使用 should 的时候,如果不满足条件,那么相关性分数会比较低,就不会返回数据给你。像下面这个条件,稍微把性别改成一个不存在的 a 和 b,跟我们想的一样,并没有返回任何数据。
这里我再加上一个 must 条件做测试,结果返回了很多数据,仔细观察 _score 字段都是有值的,这些值都是来源于 must 条件, should 条件因为没有满足的所以对 _score 没有任何贡献,因此 should 字段只是能影响 _score 字段,当其他条件能够给 _score 字段带来相关性分数时候, should 条件将不会对查询结果有任何贡献,只能够让 _score 变得大一点或者没有。
这个问题怎么解决呢? must 与 should 组合是经常会遇到的问题。
Ⅸ 如何用ElasticSearch实现下面的SQL
elasticsearch version
latest version
remarks
1.X 1.4.6 tested against elastic 1.4-1.6
2.0.0 2.0.1 delete commands not supported
Elasticsearch 1.X
./bin/plugin -u https://github.com/NLPchina/elasticsearch-sql/releases/download/1.4.6/elasticsearch-sql-1.4.6.zip --install sql
Elasticsearch 2.0.0
./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.0.1/elasticsearch-sql-2.0.1.zip
After doing this, you need to restart the Elasticsearch server. Otherwise you may get errors likeInvalid index name [sql], must not start with '']; ","status":400}.
基本用法
Visit The elasticsearch-sql web front end: