文章目录
索引
文档
字段
一个文档中可以包含多个字段,每个字段有一个数据类型与其对应。除了常用的数据类型(字符串、文本和数值)外,ES还提供了多种数据类型,如:数组类型、经纬度、IP地址类型等。ES对不同类型的字段可以支持不同的搜索功能。例如:使用文本类型的数据时,可以按照分词的方式对数据进行搜索,并且可以对设定搜索后的打分因子来影响最终的排序;再如:使用经纬度数据时,ES可以搜索某个地点附近的文档,也可以查询地理围栏内的文档。在排序函数上ES也可以基于某个地点按照衰减函数进行排序。
索引、文档和字段的关系,如图:

映射
集群与节点
在分布式系统中,为了完成海量数据的存储、计算并提升系统的高可用性,需要多台计算机集成协作,这种形式称之为集群。这些集群中的每个计算机我们又称之为节点。ES集群的节点个数是没有限制的,用户可以根据业务量、数据量增加节点,如图:

分片
在分布式系统中,为了能存储和计算海量数据,会对数据进行分片,将数据存储在不同的计算机中。在ES中一个分片对应一个Lucene索引,每个分片下面还可以设置多个副分片。索引的分片个数只能设置一次,之后不能在更改,默认情况下每个索引设置5个分片。
优点
副分片
为了提升系统索引数据的高可用性和减轻集群搜索的负载,可以启用分片的副本,副本我们称之为副分片。在一个索引中,主分片的副分片的个数是没有限制的,用户可以按需设定。在默认情况下,ES不会为主分片开启副分片,需要手动进行设置。一个分片的主分片和副分片可以存储在不同的计算机上,如图:

注意事项
DSL
| 类型 | ElasticSearch | 关系型数据库 |
|---|---|---|
| 索引方式 | 正排索引和倒排索引 | B-Tree结构 |
| 事务支持 | 不支持事务[更新文档时,先读取在更新,如果并发修改数据,使用乐观锁] | 支持事务 |
| SQL与DSL | 查询、大小、相等比较、逻辑、或、与、关系运算,文本搜索、地理位置搜索和复杂数据的搜索 | 查询、大小、相等比较、逻辑、或、与、关系运算 |
| 扩展方式 | 本身支持分片和副分片 | 需要借助第三方组件进行分库分表,分库分表会对一些业务造成延迟,查询结果的合并和多表join的操作 |
| 数据的查询速度 | ES是基于Lucene库的搜索引擎,可以支持全字段建立索引,单个索引存储上百个字段或几十亿条数据记录都是没有问题的,查询速度也不会变慢 | 字段数量与数据量过大查询速度很慢 |
| 数据的实时性 | 为了提高写入数据的性能,ES在内存和磁盘之间增加一层系统缓存,ES响应写入数据的请求后,会将数据存储到内存中,此时该数据还不能搜索到,内存中的数据每隔一段时间会被刷新到系统缓存内,此时的数据才能被搜索到。因此,ES的写入数据不是实时的,而是准实时的。 | 存储和查询数据基本上是实时的,即单条数据的写入可以立即查询 |
节点职责
节点职责类型
master节点
数据节点
协调节点
客户端可以向ES集群的节点发起请求,这个节点叫做协调节点。在默认情况下,协调节点可以是集群中的任意节点,此时他的生命周期是和一个单独的请求相关的。也就是说当客户端向集群中的某个节点发起请求时,此时该节点被称为当前请求的协调节点,当它将响应结果返回客户端后,该协调节点生命周期就结束了。如图所示,分别表示访问不同的节点,因为请求时客户端指定的请求地址不同,所以左图中的请求协调节点时node1,右图中的请求协调节点时node3。协调节点会根据具体的情况将请求转发给其他节点,并将最终汇总的处理结果返回客户端;


为了降低集群的负载,可以将某个节点作为单独的协调节点。在节点的配置文件中设置node.maste和node.data配置项为false,此时这个节点不会选中master节点并且不在担任数据节点,而客户端可以将这类节点作为协调节点来使用,把所有的请求分发到这些节点上,如图:

每个节点可以单独配置,默认情况下集群不会对节点角色进行划分,所有的节点都是相互平等的,可以担任所有的职责。但是在生产环境中需要对这些节点的角色进行最优的划分,否则在高并发的情况下集群容易出现服务阻塞超时甚至服务崩溃的隐患。
主分片和副分片
ES为了支持分布式搜索,会把数据按照分片进行切分。一个索引由一个或者多个分片构成,并且每个分片有0个甚至多个副分片。多个分片可以分布在不同的节点中,通过这种方式提高分片数据的高可用性和服务的高并发支持。
集群中的索引主分片和副分片在不同的计算机上,如果某个主分片所在的节点宕机,则原有的某个副分片会提升为主分片进行对外服务,如图:

如果node1发生了宕机,集群感知到分片0的主分片A0将要丢失,此时集群会立即对其他节点[node3]上的分片0对应的副分片C0作为主分片A0进行服务,集群中的node2和node3对外提供服务,所有的分片服务不受影响;如图:

如果node1恢复了服务并加入了集群中,因为在node1上还保留有分片0的数据,此时node1上的分片A0会变成副分片C0。在此期间丢失的数据会通过node3上的主分片A0进行补充。并且node1上的分片也会通过node2和node3对应的分片进行补充数据。
路由计算
当客户端向一个ES的协调节点发送请求时,协调节点是如何将数据存储在哪个节点的哪个分片上?
根据hash算法,公式如下:
shard = hash(routing)%number_of_prinary_shards
#routing :每条文档的提交是的参数,该值是可变的,用户可以自定义,在默认情况下使用的是文档的_id值
#number_of_prinary_shards:索引主分片的个数
计算出routing值后除以索引主分片的个数在取余,就是当前文档应该存储的分片ID。
获取分片ID后,根据分片-节点路由表获取该分片的主/副分分片节点列表,然后在转发请求。
通过上面的公式number_of_primary_shards主分片作为取余的分母不能随意改变,否则分片ID将会计算错误,进而找不到存储数据的分片节点。
文档读写过程
写入

读取
当ES协调节点收到客户端发来的查询文档请求,协调节点会根据文件找到所有的分片,根据轮询算法从主/副分片中选一个分片,然后将请求转发给该分片所在的节点,该节点完成请求后并将目标数据返回给协调节点,协调节点再将数据返回给客户端,如图:

当客户端发起查询请求到节点1[协调节点],协调节点会根据文档找到所有的分片,使用轮询算法从主/副分片中选一个分片,假如在节点3中的副分片1中,完成请求后节点3将目标数返回给节点1,节点1再将数据返回给客户端。
//在postman输入ES地址:http://localhost:9200/[索引名称]
//访问方式为:PUT
{
"mappings":{
"properties":{ //指定字段名称及其数据类型
"title":{
"type":"text" //title字段为text类型
},
"city":{
"type":"keyword" //city字段为keyword类型
},
"price":{
"type":"double" //price字段为double类型
}
}
}
}
//在postman输入ES地址:http://localhost:9200/[索引名称]/_doc/[id编号]
//访问方式为:Post
{
"title":"好再来酒店",
"city":"青岛",
"price":578.23
}
//在postman输入ES地址:http://localhost:9200/[索引名称]/_doc/[id编号]
//访问方式为:Get
{
"_index" : "hotel", //索引名称
"_type" : "_doc",
"_id" : "001", //文档ID
"_version" : 1, //文档版本
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : { //文档内容
"title" : "好再来酒店",
"city" : "青岛",
"price" : 578.23
}
}
//在postman输入ES地址:http://localhost:9200/[索引名称]/_search
//访问方式为:Get
{
"query":{ //查询内容
.........
}
}
//例如:
{
"query":{
"price":{
"value":578.23
}
}
}
//查询结果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : { //命中的分片信息
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : { //命中的文档总数
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0, //命中文档中的最高分
"hits" : [ //命中文档集合的信息
{
"_index" : "hotel", //文档所在索引
"_type" : "_doc",
"_id" : "001", //文档ID
"_score" : 1.0, //文档分值
"_source" : { //文档内容
"title" : "好再来酒店",
"city" : "青岛",
"price" : 578.23
}
}
]
}
}
//在postman输入ES地址:http://localhost:9200/[索引名称]/_search
//访问方式为:Get
{
"query":{
"match":{
"title":"再来"
}
}
}
//查询结果:
{
…
"max_score" : 0.5753642, //命中文档中的最高分
"hits" : [ //命中文档集合的信息
{
"_index" : "hotel",
"_type" : "_doc",
"_id" : "001",
"_score" : 0.5753642,
"_source" : {
"title" : "好再来酒店",
"city" : "青岛",
"price" : 578.23
}
}
]
}
}
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us
我尝试用Ruby设计一个基于Web的应用程序。我开发了一个简单的核心应用程序,在没有框架和数据库的情况下在六边形架构中实现DCI范例。核心六边形中有小六边形和网络,数据库,日志等适配器。每个六边形都在没有数据库和框架的情况下自行运行。在这种方法中,我如何提供与数据库模型和实体类的关系作为独立于数据库的关系。我想在将来将框架从Rails更改为Sinatra或数据库。事实上,我如何在这个核心Hexagon中实现完全隔离的rails和mongodb的数据库适配器或框架适配器。有什么想法吗? 最佳答案 ROM呢?(Ruby对象映射器)。还有
文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat
美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
目录一、什么是Websocket二、WebSocket部分header介绍三、HTTPVSWebSocket四、什么时候使用WebSockets五、关于SockJS和STOMP一、什么是Websocket根据RFC6455标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。Websocket交互始于HTTP请求,该请求会通过HTTPUpgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:GET/spring-websocket-portfoli