• [技术干货] Elasticsearch中的自定义打分
    Elasticsearch默认使用TF/IDF(词频/逆向文档频率)对匹配的文档进行打分,在特定业务下,这可能不是需要的结果。下面介绍自定义打分的方式: 不关心TF/IDF,只关心是否有特定功能,并结合用户好评率 假设一个电视机文档如下: [code]curl -XPOST 'localhost:9200/mall/tv/_bulk?pretty' -H 'Content-Type: application/json' -d' { "index": {"_id": "1"}} { "name": "tv1", "description": "USB, DisplayPort", "vote": 0.98 } { "index": {"_id": "2"}} { "name": "tv2", "description": "USB, HDMI", "vote": 0.99 } { "index": {"_id": "3"}} { "name": "tv3", "description": "USB", "vote": 0.5 } { "index": {"_id": "4"}} { "name": "tv3", "description": "USB, HDMI, DisplayPort", "vote": 0.7 } ' [/code] 要找有USB、HDMI、DisplayPort接口的电视,不关心在文档中出现是否频繁,只关心是否出现过。如果接口出现,则记 1 分,不出现记 0 分;另外再考虑用户好评率,在前面的得分上乘以好评率 使用constant_score查询,只关心是否出现特定词。再使用field_value_factor叠加用户好评率(记录在vote字段) 查询如下: [code]curl -XGET 'localhost:9200/mall/tv/_search?pretty' -H 'Content-Type: application/json' -d' { "query":{ "function_score":{ "query":{ "bool":{ "should":[ {"constant_score":{ "query":{"match":{"description":"USB"}} }}, {"constant_score":{ "query":{"match":{"description":"HDMI"}} }}, {"constant_score":{ "boost":2, "query":{"match":{"description":"DisplayPort"}} }} ] } }, "field_value_factor":{ "field":"vote", "factor":1 }, "boost_mode":"multiply", "max_boost":10 } } } ' [/code] 最后的效果是:new_score = query_score * (factor * number_of_votes) max_boost对结果加了一个上限,不会超过10 modifier和boost_mode的取值,可以参考https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-function-score-query.html 减弱刷好评的问题 不考虑用绝对好评作为评分因素,这会对其他商品不公平,设定一个好评门限,高于门限会有一个正向分数,低于门限有一个负向分数。这时function_score 内置的函数无法满足应用场景,可以使用 script_score 函数自行实现逻辑 查询如下: [code]curl -XGET 'localhost:9200/mall/tv/_search?pretty' -H 'Content-Type: application/json' -d' { "query":{ "function_score":{ "query":{ "bool":{ "should":[ {"constant_score":{ "query":{"match":{"description":"USB"}} }}, {"constant_score":{ "query":{"match":{"description":"HDMI"}} }}, {"constant_score":{ "boost":2, "query":{"match":{"description":"DisplayPort"}} }} ] } }, "script_score":{ "script":{ "params":{"threshold":0.8}, "inline":"if (doc[\"vote\"].value > params.threshold) {return 1;} return 0.5;" } }, "boost_mode":"multiply", "max_boost":10 } } } ' [/code]
  • 如何将window上的数据实时上传ES
    本帖最后由 ES_Siyu 于 2018-3-19 09:24 编辑这篇文章讲述了如何从本地windows机器通过华为云DIS服务(数据接入服务)将日志数据上传云端,并通过CDM服务(云数据迁移服务)迁移到华为云Elasticsearch服务,方便客户通过搜素引擎高效管理和获取日志。本文旨在梳理整个流程,专注于实现无代码实时上传数据,故不会详述细节,具体可参考相关链接的文档。 注:可能因为相关服务升级,界面会有所不同。 整体流程: 12536 1 在华为云申请DIS服务详细细节可参考https://static.huaweicloud.com/upload/files/pdf/20171211/20171211155133_47665.pdf 1.1 申请步骤登录http://www.huaweicloud.com/product/dis.html。点击“立即购买”。12537配置参数。12538点击“提交申请”,进入下一页面。点击“确认申请”。12539 回到管理界面,查看创建好的DIS服务。12540 1.2 安装Agent上传数据首先连接https://dis-publish.obs-website.cn-north-1.myhwclouds.com/下载红框中的压缩包。12541 在工作目录解压,打开“dis-agent-1.0.2\conf\agent.yml”。12542 12543 12544 构建数据。这里新建一条apache日志。注意这个文件的路径要和上文的“agent.yml”中的“filePattern”保持一致。12545 启动Agent并上传数据。12546 2 在华为云申请ES服务详细细节可参考 http://static.huaweicloud.com/upload/files/pdf/20180115/20180115101401_17315.pdf 2.1 申请步骤首先,进入页面http://www.huaweicloud.com/product/es.html购买集群,选择es集群的配置后,点击“立即购买”。 12547 然后进入规格确认界面,在右下角点击“提交申请”,即可使用es服务。12548 最后,回到集群管理页面,便可看见已创建好的es集群。 2.2 创建index首先,在集群管理界面,点击对应es的“Kibana”。12549 进入后点“Dev Tools”。在我们例子中,我们要创建一个index为“apache”,type为“logs”的索引,其中包括6个字段。12550 一旦出现上图右边确认的信息,便说明索引创建成功了。 3 在华为云申请CDM服务详细细节可参考http://static.huaweicloud.com/upload/files/pdf/20171208/20171208181144_40775.pdf 3.1 申请步骤首先,进入页面http://www.huaweicloud.com/product/cdm.html购买集群,进入规格选型页面,根据需求配置好节点和网络。12551 接着,来到规格确认页面,检查配置是否满足自己的需求。如果没问题,则勾选右下角,点击提交申请。12552 大概会花几分钟创建服务。可以在集群管理页面查看。 3.2 创建DIS和ES连接首先,找到对应的CDM集群,点击“作业管理”。12553 接着,点击“连接管理”,“新建连接”。配置好DIS信息和ES集群信息。12554 其中DIS连接中的AK,SK等按照上文DIS说明填写。12555 12556 3.3 在CDM创建作业回到“表/文件迁移”界面,点击“新建作业”。12557 配置好作业信息,连接DIS和ES。在这里,“偏移量参数”选择“最早”,这样可以把已经存在于DIS的数据导入到ES。12558 点击“下一步”,进行字段匹配。在这里,把左边的DIS数据和右边的ES字段进行匹配,比如“70.78.109.44”匹配ES的“host”字段。注意我们要对原始数据进行一次清洗。点击此处用红色圈出来的三个字段的转换器。12559 在date字段上,ES默认接受的格式是“yyyy-MM-ddTHH:mm:ssZ”,所以需要把原本数据转换,同时去掉不需要的括号“[”。具体来说,要把“[11/Mar/2017:12:17:21”转换为“2017-03-11T12:17:21Z”。具体做法为选择“表达式转换”,输入DateUtils.format(DateUtils.parseDate(StringUtils.strip(value,"["),"dd/MMM/yyyy:HH:mm:ss"),"yyyy-MM-dd´T´HH:mm:ss´Z´")。12560 在method字段,我们需要去掉多余的引号。同样选择“表达式转换”,输入StringUtils.strip(value,"\"")。12561 在最后的bytes字段,因为包含“\r”(在界面上无法显示),所以需要去掉。同样选择“表达式转换”,输入StringUtils.trim(value)12562 配置好了之后点击下一步,在“任务配置”中选择定时执行。在这里我们选择每分钟执行一次。客户可以根据自己的需求来指定。12563 点击“保存并运行”,回到界面,如果现实“写入行数:1”,则表示写入成功。 12654 4 在Kibana上查看结果 回到Kibana界面,通过搜索获取刚刚导入的数据。 12655
  • java访问ES http接口例子
    很多人咨询如何使用java访问ES的http接口,这里写一个样例,以供参考,详见附件。
  • 如何使用LogStash将数据迁移到Elasticsearch
    摘要:结合华为云,介绍如何使用Logstash将数据迁往Elasticsearch(ES),为后续提供指导。 一、背景首先介绍下ES常用的数据导入工具,以及华为云上ES的应用场景:1)常用数据导入方法:将数据导入到ES的方法较多,常用的工具与方法包括:Elasticsearch-dump,通过Snapshot,Beats以及LogStash等等;其中Elasticsearch-dump主要用于ES集群间导入导出数据,Snapshot主要用于ES集群间数据的备份与恢复,Beats与LogStash作为独立的ETL工具,其应用场景较广泛。 2)华为云ES应用场景:华为云上的ES服务运行在独立的VPC中,通过外网无法直接访问,因此其主要使用场景是在ES集群所在VPC下申请一台ECS并绑定弹性IP地址(用于部署业务应用),然后客户通过EIP访问业务应用,业务应用程序再调用ES集群。具体如下图: 二、具体使用场景【conf文件组成】使用Logstash将数据导入到ES集群,其关键在于如何配置其conf文件。一般而言,Logstash的配置文件包括3个部分,分别是input,filter,以及output;其中input用于配置数据源,filter用于对数据进行ETL预处理,output用于配置目的端。 【运行Logstash】当配置好conf文件后(假设其名称为logstash-simple.conf),接下来在logstash目录下,通过如下命令可启动数据导入:./bin/logstash -f logstash-simple.conf; 【具体使用场景】接下来我们结合几个具体需求来介绍如何配置conf文件:1)如何指定导入的index与type名称? 使用Logstash导入数据的过程中,如果没有指定index以及type,默认使用logstash-%{+YYYY.MM.dd}以及logs;如果想指定index以及type,可以在output中增加如下内容,使得index以myindex开头,type为mytype:output { elasticsearch { hosts => "192.168.0.65:9200" index => "myindex-%{+YYYY.MM.dd}" document_type => "mytype" } } 2)如何删除导入过程中产生的新字段?使用Logstash在进行数据导入的过程中,默认会添加两个字段@version,@timestamp;如果在应用中不想要这两这个字段,可以在filter中增加如下内容:filter { mutate { remove_field => ["@version"," @timestamp"] } } 3)如何使得索引名称与当前时区一致?使用Logstash在进行数据导入的过程中,index名称后缀默认为@timestamp字段所对应的UTC时间,该设计的初衷是为了统一不同时区的查询(不同时区的查询经过Kibana首先会转化为UTC时间,然后Kibana再向ES发送查询请求,这样不同时区查询过去一段时间的数据时,获得的结果是一样的),但这种情况下如果要查询本地时间某天的数据,则需要遍历Day-1,Day以及Day+1 3天的index;为了兼顾统一查询以及查询效率,可以在filter中增加如下内容,这里假设源数据中存在一个时间字段timestamp,并且其格式为dd/MMM/yyyy:HH:mm:ss +0800(其他格式类似),那么通过如下命令可以将timestamp字段向前滚动8个小时,然后赋值给@timestamp,从而使得index名称的后缀为东八区的时间,同时通过使用timestamp进行统计分析,仍然可以统一查询。filter { date { match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss +0800"] locale => "en" timezone => "UTC" } } 4)如何将外网数据导入到华为云ES,并控制数据导入速率? 如前所述,将外网数据导入到华为云ES,需要一台带有EIP的ECS作为中转,此时根据Logstash部署的位置,可分为两种场景:一种是Logstash部署在外网,一种是Logstash部署在ECS上。 a) 当Logstash部署在外网时,首先需要申请一台与ES集群在同一VPC下的ECS,并开放其安全组的9200外网访问权限;然后为该ECS绑定一个EIP,并限制该EIP的网络带宽;接下来在ECS上做一个端口映射,具体命令如下,然后输入root用户密码完成端口转发(其中9200为EIP接入端口,192.168.0.66:9200为ES集群接入点,192.168.0.200为ECS本机的内网ip地址):ssh -g -L 9200:192.168.0.66:9200 -N -f [email]root@192.168.0.200[/email]最后配置Logstash的conf文件output部分如下,然后运行Logstash开始数据导入过程: output { elasticsearch { hosts => "EIP:9200" } } b) 当Logstash部署在ECS上时,首先需要确保ES集群与ECS在同一VPC下,并且已开放安全组的9200外网访问权限;然后为该ECS绑定一个EIP,并限制该EIP的网络带宽;最后按常规方式配置conf文件,并运行Logstash开始数据导入过程(不再需要在ECS上做端口映射)。 三、拓展思考上面给大家介绍了如何使用Logstash将数据导入到ES集群,此外Logstash还可以用于ES集群内部index的变换处理,包括index合并、过滤某些字段等等。另外如果是在两个ES集群间互导数据,可通过指定document_id防止重复导入数据。
  • 如何将外网数据导入到华为云ES
    将外网数据导入到华为云ES,需要一台带有EIP的ECS作为中转,此时根据Logstash部署的位置,可分为两种场景:一种是Logstash部署在外网,一种是Logstash部署在ECS上。 a) 当Logstash部署在外网时,首先需要申请一台与ES集群在同一VPC下的ECS,并开放其安全组的9200外网访问权限;然后为该ECS绑定一个EIP,并限制该EIP的网络带宽;接下来在ECS上做一个端口映射,具体命令如下,然后输入root用户密码完成端口转发(其中9200为EIP接入端口,192.168.0.66:9200为ES集群接入点,192.168.0.200为ECS本机的内网ip地址):ssh -g -L 9200:192.168.0.66:9200 -N -f [email]root@192.168.0.200[/email]最后配置Logstash的conf文件output部分如下,然后运行Logstash开始数据导入过程: output { elasticsearch { hosts => "EIP:9200" } } b) 当Logstash部署在ECS上时,首先需要确保ES集群与ECS在同一VPC下,并且已开放安全组的9200外网访问权限;然后为该ECS绑定一个EIP,并限制该EIP的网络带宽;最后按常规方式配置conf文件,并运行Logstash开始数据导入过程(不再需要在ECS上做端口映射)。
  • Elasticsearch普通分页与Scroll遍历数据
    普通分页 一个最基本的普通分页查询语句是这样的: 9904 Elasticsearch收到查询请求之后会在每个shard上面查询100+20条数据,然后合并并排序之后选择前面的100+20条记录,最后再将这120条记录里面的第101到120条记录返回。这种方式在from的值比较小的时候是比较适用的,但当from的值很大时,比如100万,那么这种方式就非常消耗CPU,内存,IO等资源了。这个时候就需要用Elasticsearch提供的scroll的方式来实现遍历。 Scroll遍历数据 Scroll查询允许我们先做查询初始化,然后再批量地拉取结果,有点儿类似于传统数据库中的cursor。 查询初始化的操作如下: 9905 初始化操作会把符合条件的数据排序并且缓存起来,可以理解成快照,保留一段时间,保留时间由scroll的值确定,上面是10分钟。查询初始化之后索引上的任何变化会被它忽略。 初始化操作的返回结果包含一个字段_scroll_id 9908 接下来的拉取结果就需要带上参数_scroll_id 9907 不停地这样调用就可以把初始化时缓存的数据遍历完了。 可能会报的错误 1 search_context_missing_exception 在初始化操作时如果报这个错误说明scroll的值设置小了,需要增大 2 Unknown key for a VALUE_STRING in [scroll] 拉取数据时需要用POST或者GET /_search/scroll
  • [教程] 跨region访问Elasticsearch集群
    本帖最后由 ES_ge 于 2018-1-9 20:52 编辑如何在跨region的情况下访问Elasticsearch集群,比如华南区的ECS节点去访问华北区的Elasticsearch集群。默认情况下,region之间是无法直接访问的,这就需要建两个vpn,用vpn打通region之间的网络 操作步骤 1 在华北区新建一个Elasticsearch集群 8589 2 在华南区新建一个ECS节点 8605 ECS节点的vpc是vpc-c952,vpc-c952的网段是192.168.0.0/16,ECS的IP是192.168.1.231 8594 3 修改华为区Elasticsearch集群所在的安全组的规则,开放9200端口 8595 4 用华南区的ECS节点访问Elasticsearch集群,ECS节点IP是192.168.1.231,访问不通 8610 需要在ECS和Elasticsearch集群各自所在的vpc上建立vpn,由vpn来打通两个region的网络 5 在华北区建立vpn 8598 此vpn所属的vpc要与Elasticsearch集群相同,这个时候因为另一端的vpn没有建立,所以远端网关和远端子网可以随便填,等另一端的vpn建立之后再来更新远端网关和远端子网的值 6 在华南区建立vpn 8601 此vpn所属的vpc要与ECS相同,远端网关和远端子网的值填华北区vpn的本端网关和本端子网 7 更新华北区vpn的远端网关和远端子网 8602 8 用华南区的ECS节点访问Elasticsearch集群,访问成功 8611
  • [教程] 跨安全组访问Elasticsearch集群
    如何在跨安全组的情况下去访问Elasticsearch集群 默认情况下,只有在同一安全组的节点才能访问Elasticsearch集群, 我们可以通过修改Elasticsearch集群安全组的规则,达到跨安全组访问Elasticsearch集群的目的。 操作步骤 1 Elasticsearch集群信息 7567 2 Elasticsearch集群安全组信息 7566 默认是同一安全组的节点才能访问 3 节点信息 7570 节点和Elasticsearch集群在同一vpc里面,但不在同一安全组里面 4 节点访问集群,发现无法访问 7569 5 进入"网络控制台" 7582 选择"安全组" 7581 再点击集群所在的安全组,点击"添加规则" 7571 点击"确定",就可以看到新添加的规则在规则列表里面了 7572 6 节点访问集群,成功访问 7568
  • [云日志] Elasticsearch5.x高负载场景下的优化建议
    本帖最后由 vincent 于 2017-12-10 11:32 编辑 索引性能提升:1. 用批量索引(/_bulk)代替单个文档的索.当然如果在普通单索引的场景下数据节点的LA就很高,IO压力已经达到最高,bulk也是没意义的。2. 修改默认的refresh频率,众所周知,一个文档持久化到磁盘要经历,先写到内存buffer的中,然后refresh到内核文件系统缓存中生成一个segment,此时segment中的文档才可以被搜索到,最后flush到磁盘上。Es默认的refresh频率是1s 也就是说,一个文档从被索引到能够被搜索到最快是1秒。如果使用的场景对索引性能要求比较高,对搜索延迟容忍比较大的情况下可以考虑修改索引的默认refresh时间为30秒,当然这并不意味着这个值越大,索引性能就会越好。3. 合理设置副本数,我们要坚持使用最少的分片的原则,node number=primary shard number*(repli+1),副本数越多意味着索引速度越慢,对磁盘IO占用越大。对于像debug日志这种丢失对我们没有影响的数据可以考虑索引的副本数设置为0,4. 考虑使用SSD(记住:SSD带来的索引速度提升是几十倍的帮助,所以如果不差钱就大胆用吧, {:2_27:}),没钱的情况下{:2_25:}就考虑为es数据节点配置多个数据存储路径吧5. 定期对segment做清理合并,减少碎片数量,POST /[indice1,indice2...]/forcemerge?max_num_segments=16. 禁用swapping,防止内存交换到swap区,修改配置文件bootstrap.memory_lock: true,需要重启生效,可通过访问api验证成功与否:http://[client_ip]:9200/_nodes/process7. 使用文档自动生成的id,如果索引的过程制定文档id,意味着每一次索引都要去check该id是否存在。 查询性能提升: 1. 使用路由功能是我们提高查询速度的首选方案,前提是在索引文档时候就要指定路由,具有相同路由值的文档会存储在同一个shard上,众所周知,es的查询请求默认是会被分配到索引的每一个shard上,然后在每个shard上做查询,把查询结果返回给client节点做汇聚,如果我们在查询的时候就指定正确的路由,client节点会把查询请求只分配到对应的shard上做查询,避免不必要的资源浪费。因此,建议使用路由。2. 定期对历史数据做segment的合并,过多的segment会导致查询性能低下。3. 单索引不宜定义过多的shard,shard过多会带来IO压力,原因同样是es会把每个请求都分发到所有的shard上。每个shard做查询然后数据汇总返回。 以上是关于es在使用过程中对索引和查询的几点优化建议,如果大家还有更好的方案,欢迎补充。{:4_98:}
  • [技术干货] Elasticsearch测试工具
    为了方便大家进行Elasticsearch的测试,以便评估自己业务对Elasticsearch集群规模的需求,写了两个简单的工具。详见附件。写入测试工具:esWritePref使用方式:esWritePref/usage.txt查询测试工具:esQueryPref使用方式:esQueryPref/usage.txt使用条件:需要执行机上具备JAVA8
  • [问题求助] ES支持哪些搜索功能
    ES支持哪些搜索功能?
  • [问题求助] 如何加载数据到ES
    如何加载数据到ES?
  • [问题求助] ECS无法连接到ES中的Elasticsearch集群
    ECS无法连接到ES中的Elasticsearch集群,怎么处理?
  • [问题求助] 用户或者应用程序如何访问ES中的Elasticsearch集群
    用户或者应用程序如何访问ES中的Elasticsearch集群
  • [问题求助] Elasticsearch是否支持Kibana对接
    Elasticsearch是否支持Kibana对接
总条数:153 到第
上滑加载中