Easysearch、Elasticsearch 还是 Opensearch,是个问题

spring data elasticsearch怎么设置返回值的条数

Elasticsearchkennys 回复了问题 • 2 人关注 • 2 个回复 • 4446 次浏览 • 2018-12-25 14:17 • 来自相关话题

社区日报 第489期 (2018-12-25)

社区日报kimichen123 发表了文章 • 0 个评论 • 1070 次浏览 • 2018-12-25 09:55 • 来自相关话题

1、用ElasticSearch搭建自己的搜索和分析引擎
http://t.cn/E4n6of8
2、Elasticsearch 集群性能的最佳实践
http://t.cn/E4n6M3v
3、海量数据下Elasticsearch搜索引擎分析与搭建
http://t.cn/R3bde2J

编辑:叮咚光军
归档:https://elasticsearch.cn/article/6223
订阅:https://tinyletter.com/elastic-daily

elasticsearch searchguard 修改密码初始化失败

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 7421 次浏览 • 2018-12-25 08:42 • 来自相关话题

es超时问题

Elasticsearchzqc0512 回复了问题 • 3 人关注 • 2 个回复 • 1209 次浏览 • 2018-12-25 08:41 • 来自相关话题

访谈:2亿+ vivo 手机背后搜索服务平台的故事

Podcastmedcl 发表了文章 • 0 个评论 • 2195 次浏览 • 2018-12-24 19:09 • 来自相关话题

欢迎来到 Elastic 社区电台的第九期节目,我们本期节目的嘉宾是来自于 vivo 互联网负责搜索业务研发的杨振涛,vivo 从 Elasticsearch 2.1.1 版本开始,如今使用 100 多个 Elasticsearch 集群来支撑全球 2 亿多台手机每天的各种搜索请求,如 vivo 的应用商店、游戏、音乐、主题、壁纸、铃声等各种手机服务背后的搜索服务,也包括产品配件、售后、FAQ 等企业门户官网的搜索请求。今天让我们一起走进 vivo,看看 vivo 具体是如何使用 Elasticsearch 来解决这些搜索问题的。

可以点击下面的任意链接来收听(时长约 50 分钟):

  • Apple iTunes: [https://itunes.apple.com/cn/podcast/elastic-社区电台/](https://itunes.apple.com/cn/po ... %25B0/)
  • 喜马拉雅:[https://www.ximalaya.com/keji/14965410/146649768](https://www.ximalaya.com/keji/14965410/146649768)
  • 蜻蜓 FM:[https://www.qingting.fm/channe ... 96421](https://www.qingting.fm/channe ... 396421)

    嘉宾


    podcast_vivo_banner720x420.jpg



    杨振涛,vivo 互联网搜索引擎架构师,专注于数据的存储、检索与可视化,以及 DevOps 与软件过程改进。Elastic 中文社区深圳地区负责人,发起并组织 Elasticsearch、Redis、Jenkins 等主题的技术沙龙,并参与多个开源项目的文档翻译和中文化工作。 技术翻译爱好者,InfoQ 中文社区编辑,TED Translator。

    主持人

    Elastic 技术布道师,曾勇(Medcl)。

    关于 vivo

    vivo为一个专注于智能手机领域的手机品牌,vivo和追求乐趣、充满活力、年轻时尚的群体一起打造拥有卓越外观、专业级音质、极致影像、愉悦体验的智能产品,并将敢于追求极致、持续创造惊喜作为vivo的坚定追求。

    关于 Elastic 社区电台

    Elastic 开源社区举办的一款播客类节目, 邀请来自开源社区的用户,一起聊聊 Elastic 开源产品的使用案例、经验分享、架构变迁等等。

    相关链接


  • [社区活动计划](https://meetup.elasticsearch.c ... 9.html)

  • [vivo 招聘页面](https://hr.vivo.com)

Day 25 - Elasticsearch Ingest节点数据管道处理器

Adventbindiego 发表了文章 • 1 个评论 • 5838 次浏览 • 2018-12-24 18:18 • 来自相关话题

​首先还是祝大家圣诞快乐,既然是节日,我们就讨论一个比较轻松的话题。如何使用6.5引入[数据管道处理器](https://www.elastic.co/guide/e ... r.html)来更好的治理预定义好的数据管道。

背景


2018这一年来拜访了很多用户,其中有相当一部分在数据摄取时遇到包括性能在内的各种各样的问题,那么大多数在我们做了ingest节点的调整后得到了很好的解决。Ingest节点不是万能的,但是使用起来简单,而且抛开后面数据节点来看性能提升趋于线性。所以我一直本着能用ingest节点解决的问题,绝不麻烦其他组件的大体原则 :-)

下面快速回顾一下ingest节点的角色定位。

ingest.png



使用场景


通过上面的图纸我们很容易看到ingest节点可以在数据被索引之前,通过预定义好的处理管道对其进行治理。但这里一直存在一个局限性,就是只能通过一条管道。那么一直以来应对这个不便的方案就是把所有的处理器和细节全部配置到当前管道下。那么带来的问题也是比较明显的:

  • 复制、粘贴很多相同的管道配置在不同数据管道里
  • 非常难管理、维护冗长的管道
  • 如果要更新一个处理细节的话要找到定位所有使用过这个逻辑的管道

    其实这块对于开发的同学们很好理解,当你经常复制、粘贴代码的时候,就是时候好好思考一下了。我想说到这里大家其实已经明白了,这个管道处理器实际就是提供了一个允许你在一个管道内调用其他管道的方案。

    他的使用非常简单,就像函数调用一样只有一个必要参数name

    <br /> {<br /> "pipeline": {<br /> "name": "<其他管道的名称 - 英文字符>"<br /> }<br /> }<br />

    当然,也像其他处理器一样提供了on_failure参数来处理错误,并且还有一个非常实用的if参数来判断是否执行这个管道,这里就不做详细介绍了。

    举例


    这里我们用一个非常简单的案例来看看如何使用管道处理器。

    假设在Elastic公司,我们使用员工卡来作为进入公司和各个部门以及房间的钥匙,并且这些刷卡事件也会被记录下来。那么由于上班卡机和门禁供应商不同,数据格式也不一样。但是最后都有一个通用的逻辑,就是除了事件发生的时间,我们还会记录下数据录入到Elasticsearch的时间。

    首先我们看一下原始数据:

    ```

    公司正门卡机数据

    2018-12-25T08:59:59.312Z,front_door,binw,entered

    架构部门禁数据

    @timestamp=2018-12-25T09:15:34.414Z device_id=recreation_hall user=binw event=entered
    ```

    那如果在6.5之前,我们定义2条管道是这个样子

    1. 正门卡机管道
  • grok 解析数据
  • 打上数据录入的时间戳
  • 明确录入时间戳的处理器

    1. 门禁数据管道
  • KV 解析数据
  • 打上数据录入的时间戳
  • 明确录入时间戳的处理器

    很明显又66.67%的配置都是重复的,所以这里我们可以更优雅的解决这个问题

    1. 统一的数据录入时间戳处理器
  • 打上数据录入的时间戳
  • 明确录入时间戳的处理器

    <br /> PUT _ingest/pipeline/pl_cmn<br /> {<br /> "description": "刷卡数据通用管道",<br /> "processors": [<br /> {<br /> "set": {<br /> "field": "ingest_timestamp",<br /> "value": "{{_ingest.timestamp}}"<br /> }<br /> },<br /> {<br /> "set": {<br /> "field": "cmn_processed",<br /> "value": "yes"<br /> }<br /> }<br /> ]<br /> }<br />

    1. 正门卡机管道
  • grok 解析数据
  • <调用管道 pl_cmn>

    <br /> POST _ingest/pipeline/_simulate<br /> {<br /> "pipeline": {<br /> "description": "正门打卡机数据处理管道",<br /> "processors": [<br /> {<br /> "grok": {<br /> "field": "message",<br /> "patterns": [<br /> "%{TIMESTAMP_ISO8601:@timestamp},%{WORD:device_id},%{USER:user},%{WORD:event}"<br /> ]<br /> }<br /> },<br /> {<br /> "pipeline": {<br /> "name": "pl_cmn"<br /> }<br /> }<br /> ]<br /> },<br /> "docs": [<br /> {<br /> "_source": {<br /> "message": "2018-12-25T08:59:59.312Z,front_door,binw,entered"<br /> }<br /> }<br /> ]<br /> }<br />

    1. 门禁数据管道
  • KV 解析数据
  • <调用管道 pl_cmn>

    <br /> POST _ingest/pipeline/_simulate<br /> {<br /> "pipeline": {<br /> "description": "架构部门禁数据处理管道",<br /> "processors": [<br /> {<br /> "kv": {<br /> "field": "message",<br /> "field_split": " ",<br /> "value_split": "="<br /> }<br /> },<br /> {<br /> "pipeline": {<br /> "name": "pl_cmn"<br /> }<br /> }<br /> ]<br /> },<br /> "docs": [<br /> {<br /> "_source": {<br /> "message": "@timestamp=2018-12-25T09:15:34.414Z device_id=recreation_hall user=binw event=entered"<br /> }<br /> }<br /> ]<br /> }<br />

    好啦,这个例子非常简单。但当面对复杂业务场景的时候,会让你整个数据管道的管理比以前整齐很多。再结合合理的架构和数据治理,ingest节点也可以让你的整个数据处理能力有所提升。

    写在最后


    在文章的例子里,我们往索引里灌注的是一个个的事件数据。那要如何对数据中的实体进行有效的分析呢?那不得不说到面向实体的数据模型设计。Elasticsearch本身也提供了工具能让我们快速实现,让我们明年有机会的时候再与大家分享吧。最后还是祝愿大家度过一个愉快的圣诞节和元旦!

怎样修改filebeat中的索引名称。默认的是“filebeat-6.2.1-2018.06.14”这种格式。 直接在filebeat.yml文件中添加“index: indexName”是不行的的。

Beatsrochy 回复了问题 • 3 人关注 • 2 个回复 • 7599 次浏览 • 2018-12-24 15:51 • 来自相关话题

社区日报 第488期 (2018-12-24)

社区日报cyberdak 发表了文章 • 1 个评论 • 1052 次浏览 • 2018-12-24 13:14 • 来自相关话题

1.聊聊 ElasticSearch 使用场景
http://t.cn/E4QEI6q
2.让 Elasticsearch 飞起来:性能优化实践干货
http://t.cn/E4Q3cbj
3.Filebeat issue 排查  : i/o timeout
http://t.cn/E4Q3Bhz

编辑:cyberdak
归档:https://elasticsearch.cn/article/6220
订阅:https://tinyletter.com/elastic-daily

关于ik_max_word配置同义词死循环分词问题

Elasticsearchmedcl 回复了问题 • 6 人关注 • 1 个回复 • 2369 次浏览 • 2018-12-24 10:18 • 来自相关话题

kibana分别使用Timelion和饼状图显示一小时的流量结果不一样

Kibanazqc0512 回复了问题 • 3 人关注 • 4 个回复 • 2832 次浏览 • 2018-12-24 08:58 • 来自相关话题

logstash sql_last_value 记录的时间比SQL查到的最后一条数据的时间大十四个小时

Logstashzqc0512 回复了问题 • 4 人关注 • 3 个回复 • 4144 次浏览 • 2018-12-24 08:54 • 来自相关话题

Logstash中input-redis如何配置集群

Logstashzqc0512 回复了问题 • 4 人关注 • 4 个回复 • 2501 次浏览 • 2018-12-24 08:52 • 来自相关话题

kibana可视化 中怎么 截取keyword 信息

Kibanazqc0512 回复了问题 • 5 人关注 • 4 个回复 • 4290 次浏览 • 2018-12-24 08:51 • 来自相关话题

ES使用search-guard-ssl加固后,有什么好的性能测试工具压测索引和查询的tps?以及是否有支持认证的集群管理工具?

Elasticsearchtypuc 回复了问题 • 3 人关注 • 2 个回复 • 2256 次浏览 • 2018-12-23 22:25 • 来自相关话题

Day 23 - 基于 HanLP 的 ES 中文分词插件

Adventrochy 发表了文章 • 0 个评论 • 6702 次浏览 • 2018-12-23 11:51 • 来自相关话题

一、分词插件

1、分词器概念

在 ES 中,分词器的作用是从文本中提取出若干词元(token)来支持索引的存储和搜索,分词器(Analyzer)由一个分解器(Tokenizer)、零个或多个词元过滤器(TokenFilter)组成。

分解器用于将字符串分解成一系列词元,词元过滤器的作用是对分词器提取出来的词元做进一步处理,比如转成小写,增加同义词等。处理后的结果称为索引词(Term),引擎会建立 Term 和原文档的倒排索引(Inverted Index),这样就能根据 Term 很快到找到源文档了。

![文本分词并索引的过程](http://img.luooqi.com/FsIejZLnwcQiiTYNlLl-a8sLUepg)

2、选择分词器

目前 ES 分词插件的选择性还是很多的,分词插件的核心就是提供各种分词器(Analyzer)、分解器(Tokenizer)、词元过滤器(TokenFilter);根据依赖的核心分词包(分词算法)的不同显现出不同的差异性,除了分词算法之外,是否支持用户自定义词典,是否支持词典热更新等其他附加功能也是选择分词插件时需要参考的。

下面列出选择分词插件需要考虑的因素(仅供参考):

  • 分词准确性:大家都希望分词结果能够尽可能准确,与分词准确性直接相关的就是用户词典了,此外才是分词算法;
  • 分词算法:个人认为无需纠结于分词算法,大多数分词包提供的分词算法都比较类似,选择时不需要过于纠结;
  • 分词速度:这个与分词算法直接相关,基于词典的分词算法一般比基于模型的分词算法要快;基于词典如果考虑词频、命名实体识别、词性标注则会慢一些;
  • 启动速度:当词典较大时,初始化词典会比较慢,某些分词器会对词典进行缓存,第二次启动会非常速度;
  • 内存占用:与分词算法、词典大小、模型大小均有关系,设计精巧的算法对内存占用较小;
  • 易用性:分词器是否开箱即用,是否可以直接使用在线链接或者压缩包进行安装,是否需要复杂的配置;
  • 扩展性:是否支持用户自定义词典、是否支持自定义分词算法、是否支持热更新等;
  • 是否开源:开源的分词器在遇到问题的时候可以自己进行深度调试,甚至可以进行二次开发;
  • 社区活跃度:这个看一下 github 的 star 数或者依赖的分词包的 star 数和 issue 数目即可判定;
  • 更新频率:是否能够与最新版的 ES 同步更新。

    二、HanLP 简介

    HanLP 是一系列模型与算法组成的 NLP 工具包,具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点,详情可参考 github 介绍:[https://github.com/hankcs/HanLP](https://github.com/hankcs/HanLP)。

    选择 HanLP 作为核心的分词包开发 ES 分词插件,主要考虑以下因素:

  • HanLP 是 Java 分词包中最为流行的;
  • HanLP 提供了多种分词器,既可以基于词典也可以基于模型(在一亿字的大型综合语料库上训练的分词模型);
  • HanLP 坚持使用明文词典,这样可以借助社区的力量对词典不断进行完善;
  • 完善的开发文档和代码样例,较为活跃的用户群体;
  • 个人参与了部分功能的开发,对代码结构较为熟悉。

    三、开发分词插件

    1、代码结构

  • conf:插件的配置文件、HanLP 的配置文件、Java 安全策略文件;
  • scr.main.java.assemby:插件打包(maven-assembly-plugin)配置文件;
  • org.elasticsearch.plugin.hanlp.analysis:分词插件核心构建器;
  • org.elasticsearch.plugin.hanlp.conf:管理插件配置、分词器配置以及 HanLP 配置;
  • org.elasticsearch.plugin.hanlp.lucene:HanLP 中文分词 Lucene 插件,对 Lucune 分词进行实现;
  • scr.main.resources:插件属性文件所在目录

    ![插件代码结构](http://img.luooqi.com/FnyoQBBEjOGfmv7sEQHQToqqba0r)

    2、TokenStream

    Analyzer 类是一个抽象类,是所有分词器的基类,它通过 TokenStream 类将文本转换为词汇单元流;TokenStream 有两种实现 Tokenizer(输入为 Reader) 和 TokenFilter(输入为另一个 TokenStream)。

    ![文本分词流程](http://img.luooqi.com/FmvVcPk8KM-Ujd-lqh6qmToXL18C)

    TokenStream 基本使用流程:

    1. 实例化 TokenStream,向 AttributeSource 添加/获取属性(词汇单元文本、位置增量、偏移量、词汇类型等);
    2. 调用 reset() 方法,将流(stream)重置到原始(clean)状态;
    3. 循环调用 incrementToken() 方法,并处理 Attribute 属性信息,直到它返回 false 表示流处理结束;
    4. 调用 end() 方法,确保流结束(end-of-stream)的操作可以被执行;
    5. 调用 close() 方法释放资源。

      <br /> // 实例化 TokenStream<br /> TokenStream tokenStream = new IKAnalyzer().tokenStream("keywords",new StringReader("思想者"));<br /> // 向 AttributeSource 添加/获取属性<br /> CharTermAttribute attribute = tokenStream.addAttribute(CharTermAttribute.class);<br /> // 将流(stream)重置到原始(clean)状态<br /> tokenStream.reset();<br /> // 判断是否还有下一个 Token<br /> while(tokenStream.incrementToken()) {<br /> System.out.println(attribute);<br /> }<br /> tokenStream.end();<br /> tokenStream.close();<br />

      综上,开发 Tokenizer 或者 TokenFilter 时,需要重点关注 reset、incrementToken、end、close 四个方法的实现。

      3、开发中的小技巧

      获取插件目录或文件目录

      <br /> //获取插件根目录<br /> private static Path getPluginPath() {<br /> return env.pluginsFile().resolve("analysis-hanlp");<br /> }<br /> //获取插件目录下的文件<br /> private static Path getDefDicConfigPath() {<br /> return env.pluginsFile().resolve("analysis-hanlp/hanlp.properties").toAbsolutePath();<br /> }<br />

      插件属性文件

      如果希望插件属性文件(plugin-descriptor.properties)能够自动根据 pom.xml 中的属性进行赋值,则需要将文件防止到 resources 文件夹下。

      插件版本兼容性

      从实际测试来看:

  • ES5.X 及其以上的代码是完全复用的,也就是说代码逻辑不需要调整;
  • ES5.X 到 ES6.2.X 的插件是可以通用的,其特征是打包的时候需要将插件的文件全部打包到 elasticsearch 文件夹下;
  • ES6.3.X 以上的插件是可以通用的,打包的时候插件的文件全部打包到根目录即可。

    也就是说,如果你升级了新版本 ES,对于插件升级,大多数情况只需要修改下 plugin-descriptor.properties 文件中 ES 的版本号即可。

    4、安全策略文件

    在插件开发中经常会使用到文件读取、属性读取、网络链接等功能,如果不提前注册安全策略,在调用这些功能的时候会报以下错误java.security.AccessControlException: access denied

    官方给出的解决方案就是新建一个 plugin-security.policy 文件,然后在文件中声明需要的权限信息,最后在打包的时候将文件放置到插件的根目录,这样在使用 zip 包进行安装的时候,ES 会提示用户插件所需的权限信息,需要用户确认后插件才能正常安装。
    ```
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: plugin requires additional permissions @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  • java.io.FilePermission <> read,write,delete
  • java.lang.RuntimePermission createClassLoader
  • java.lang.RuntimePermission getClassLoader
  • java.lang.RuntimePermission setContextClassLoader
  • java.net.SocketPermission * connect,resolve
  • java.util.PropertyPermission * read,write
    See http://docs.oracle.com/javase/ ... .html
    for descriptions of what these permissions allow and the associated risks.

    Continue with installation? [y/N]y
    -> Installed analysis-hanlp
    ```

    5、安全策略的坑

    最开始认为只需要添加了 policy 文件,且打包到正确的位置即可解决插件的权限问题,因为在插件安装的时候 ES 已经提示了所需权限,但是代码在实际执行的时候依旧报 AccessControlException 的错误。

    参考了多个 HanLP 的 ES 分词插件,都没有获得较好的方法,后来考虑到 IK 分词器远程加载词典时,需要网络连接权限,就去看了下其远程词典加载的代码,最终找到了正确的使用方法。
    <br /> // 需要特殊权限的代码<br /> AccessController.doPrivileged((PrivilegedAction<Segment>) () -> {<br /> Segment segment;<br /> if (config.getAlgorithm().equals("extend")) {<br /> segment = new ViterbiSegment();<br /> } else {<br /> segment = HanLP.newSegment(config.getAlgorithm());<br /> }<br /> // 在此处显示调用一下分词,使得加载词典、缓存词典的操作可以正确执行<br /> System.out.println( segment.seg("HanLP中文分词工具包!"));<br /> return segment;<br /> });<br />

    四、插件特色

    简单介绍一下插件的特点:

  • 内置多种分词模式,适合不同场景;
  • 内置词典,无需额外配置即可使用;
  • 支持外置词典,用户可自定义分词算法,基于词典或是模型;
  • 支持分词器级别的自定义词典,便于用于多租户场景;
  • 支持远程词典热更新(待开发);
  • 拼音过滤器、繁简体过滤器(待开发);
  • 基于词语或单字的 ngram 切分分词(待开发)。

    Github 地址:[https://github.com/AnyListen/e ... hanlp](https://github.com/AnyListen/e ... -hanlp)