在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

[招聘] Community Advocate - China

Snip20180903_14.png
Elasticsearch 的排名又升了,要不要加入这么一家蒸蒸日上的全球领先的开源软件公司?

职位链接及描述如下: https://boards.greenhouse.io/elastic/jobs/1272161

At Elastic, we have a simple goal: to solve the world's data problems with products that delight and inspire. As the company behind the popular open source projects — Elasticsearch, Kibana, Logstash, and Beats — we help people around the world do great things with their data. From stock quotes to Twitter streams, Apache logs to WordPress blogs, our products are extending what's possible with data, delivering on the promise that good things come from connecting the dots. The Elastic family unites employees across 32 countries into one coherent team, while the broader community spans across over 100 countries.

For all of us at Elastic, community matters. Our users and contributors have helped to ensure that Elasticsearch, Kibana, Logstash, and Beats are more than just code — they are open source projects that people love to use, and love to talk about! As our Community Advocate you will champion our Elastic community.

What You Will Be Doing:

Are you that kind of person who is invigorated by sharing juicy technology goodness with the world? Do you feel at home connecting with the community members: in person, on blogs, in forums, via social channels, and at events? Is presenting at local meetups your jam and are you passionate about the Elastic Stack?

Well, this might just be your dream job.

As a Community Advocate at Elastic, you will be based in China. You will wake up each morning eager to design and deliver presentations at a wide-variety of events from customer meetings, meetups, tradeshows, and other events to help showcase technology. You will do this while traveling the region and, at times, the world, representing Elastic. Maintaining the trust of our community, as well as the respect and trust within the team, is foundational.

What You Bring Along:

  • Bachelor’s degree in a technical field (e.g. CS, CSE, EE) or relevant work experience as a software developer (mandatory)
  • Demonstrated ability to craft compelling content - including speaking engagements, blog posts, demos, messaging, etc. (mandatory)
  • You are comfortable presenting, whether it's at a local meetup or to the office of a C-suite member
  • Familiarity with, and real passion for, the Elastic Stack
  • Comfort working with a globally distributed team
  • Fluency or high working proficiency in Mandarin (mandatory)
  • Excellent spoken and written English communication skills, since this is our company's language (mandatory)

Please send us your CV in English. Things We'd Be Stoked to See on Your CV:

  • Conversations in person, on blogs, in forums, via social channels, at events give you energy and you have a proven publication history to show that
  • Experience working for a startup or an early stage company
  • Experience with open source software and/or commercial open source companies
  • Technical background and abilities in APM, PHP, node.js, JS, and/or security (nice-to-have, not mandatory)
  • Other languages

Additional Information:

  • Competitive pay based on the work you do here and not your previous salary
  • Stock options
  • Global minimum of 16 weeks of paid parental leave (moms and dads)
  • Generous vacation time and one week of volunteer time off
  • An environment in which you can balance great work with a great life
  • Your age is only a number. It doesn't matter if you're just out of college or your children are; we need you for what you can do.
  • Distributed-first company with Elasticians in over 30 countries, spread across 18 time zones, and speaking over 30 languages!

LI-KE1

Target locations: Beijing, China; Shanghai, China; Hangzhou, China

Elastic is an Equal Employment employer committed to the principles of equal employment opportunity and affirmative action for all applicants and employees. Qualified applicants will receive consideration for employment without regard to race, color, religion, sex, sexual orientation, gender perception or identity, national origin, age, marital status, protected veteran status, or disability status or any other basis protected by federal, state or local law, ordinance or regulation. Elastic also makes reasonable accommodations for disabled employees consistent with applicable law.

继续阅读 »

Snip20180903_14.png
Elasticsearch 的排名又升了,要不要加入这么一家蒸蒸日上的全球领先的开源软件公司?

职位链接及描述如下: https://boards.greenhouse.io/elastic/jobs/1272161

At Elastic, we have a simple goal: to solve the world's data problems with products that delight and inspire. As the company behind the popular open source projects — Elasticsearch, Kibana, Logstash, and Beats — we help people around the world do great things with their data. From stock quotes to Twitter streams, Apache logs to WordPress blogs, our products are extending what's possible with data, delivering on the promise that good things come from connecting the dots. The Elastic family unites employees across 32 countries into one coherent team, while the broader community spans across over 100 countries.

For all of us at Elastic, community matters. Our users and contributors have helped to ensure that Elasticsearch, Kibana, Logstash, and Beats are more than just code — they are open source projects that people love to use, and love to talk about! As our Community Advocate you will champion our Elastic community.

What You Will Be Doing:

Are you that kind of person who is invigorated by sharing juicy technology goodness with the world? Do you feel at home connecting with the community members: in person, on blogs, in forums, via social channels, and at events? Is presenting at local meetups your jam and are you passionate about the Elastic Stack?

Well, this might just be your dream job.

As a Community Advocate at Elastic, you will be based in China. You will wake up each morning eager to design and deliver presentations at a wide-variety of events from customer meetings, meetups, tradeshows, and other events to help showcase technology. You will do this while traveling the region and, at times, the world, representing Elastic. Maintaining the trust of our community, as well as the respect and trust within the team, is foundational.

What You Bring Along:

  • Bachelor’s degree in a technical field (e.g. CS, CSE, EE) or relevant work experience as a software developer (mandatory)
  • Demonstrated ability to craft compelling content - including speaking engagements, blog posts, demos, messaging, etc. (mandatory)
  • You are comfortable presenting, whether it's at a local meetup or to the office of a C-suite member
  • Familiarity with, and real passion for, the Elastic Stack
  • Comfort working with a globally distributed team
  • Fluency or high working proficiency in Mandarin (mandatory)
  • Excellent spoken and written English communication skills, since this is our company's language (mandatory)

Please send us your CV in English. Things We'd Be Stoked to See on Your CV:

  • Conversations in person, on blogs, in forums, via social channels, at events give you energy and you have a proven publication history to show that
  • Experience working for a startup or an early stage company
  • Experience with open source software and/or commercial open source companies
  • Technical background and abilities in APM, PHP, node.js, JS, and/or security (nice-to-have, not mandatory)
  • Other languages

Additional Information:

  • Competitive pay based on the work you do here and not your previous salary
  • Stock options
  • Global minimum of 16 weeks of paid parental leave (moms and dads)
  • Generous vacation time and one week of volunteer time off
  • An environment in which you can balance great work with a great life
  • Your age is only a number. It doesn't matter if you're just out of college or your children are; we need you for what you can do.
  • Distributed-first company with Elasticians in over 30 countries, spread across 18 time zones, and speaking over 30 languages!

LI-KE1

Target locations: Beijing, China; Shanghai, China; Hangzhou, China

Elastic is an Equal Employment employer committed to the principles of equal employment opportunity and affirmative action for all applicants and employees. Qualified applicants will receive consideration for employment without regard to race, color, religion, sex, sexual orientation, gender perception or identity, national origin, age, marital status, protected veteran status, or disability status or any other basis protected by federal, state or local law, ordinance or regulation. Elastic also makes reasonable accommodations for disabled employees consistent with applicable law.

收起阅读 »

社区日报 第383期 (2018-09-03)

1.kibana Prometheus 监控插件
http://t.cn/RFT1agw

2.logstash 6.4 新特性简介
http://t.cn/RFYDKng

3.elasticsearch rest read only 插件
http://t.cn/RZpF03g 

​活动预告
1、Elastic 中国开发者大会门票发售中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下交流活动免费报名中
https://elasticsearch.cn/article/759

编辑:cyberdak
归档:https://elasticsearch.cn/article/783
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.kibana Prometheus 监控插件
http://t.cn/RFT1agw

2.logstash 6.4 新特性简介
http://t.cn/RFYDKng

3.elasticsearch rest read only 插件
http://t.cn/RZpF03g 

​活动预告
1、Elastic 中国开发者大会门票发售中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下交流活动免费报名中
https://elasticsearch.cn/article/759

编辑:cyberdak
归档:https://elasticsearch.cn/article/783
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第382期 (2018-09-02)

1.如何将Heroku日志导入到Logsene / Managed ELK Stack。
http://t.cn/RFSfTz6
2.5分钟将CoreOS日志导入到ELK。
http://t.cn/RFSxz0S
3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。
http://t.cn/RFS9bWj

活动预告:
1、Elastic 中国开发者大会门票发售中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下交流活动免费报名中
https://elasticsearch.cn/article/759

编辑:至尊宝
归档:https://elasticsearch.cn/article/782
订阅:https://tinyletter.com/elastic-daily 
继续阅读 »
1.如何将Heroku日志导入到Logsene / Managed ELK Stack。
http://t.cn/RFSfTz6
2.5分钟将CoreOS日志导入到ELK。
http://t.cn/RFSxz0S
3.苹果圈:iPhone XS推出9月12日确认,新iPhone SE 2泄漏,苹果公司的恐慌方案。
http://t.cn/RFS9bWj

活动预告:
1、Elastic 中国开发者大会门票发售中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下交流活动免费报名中
https://elasticsearch.cn/article/759

编辑:至尊宝
归档:https://elasticsearch.cn/article/782
订阅:https://tinyletter.com/elastic-daily  收起阅读 »

社区日报 第381期 (2018-09-01)

  1. Elasticsearch 5.x 字段折叠的使用。 http://t.cn/RFodkB2

  2. 一例Query Cache引起的性能问题分析。 http://t.cn/RnOejt6

  3. ES性能优化。 http://t.cn/RFoFaRM

活动预告

1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html

2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759

继续阅读 »
  1. Elasticsearch 5.x 字段折叠的使用。 http://t.cn/RFodkB2

  2. 一例Query Cache引起的性能问题分析。 http://t.cn/RnOejt6

  3. ES性能优化。 http://t.cn/RFoFaRM

活动预告

1、Elastic 中国开发者大会最后一波早鸟票发售进行中 https://conf.elasticsearch.cn/2018/shenzhen.html

2、Elastic Meetup 9月8日 北京线下沙龙正在报名中 https://elasticsearch.cn/article/759

收起阅读 »

社区日报 第380期 (2018-08-31)

1、Elasticsearch存储详解
http://t.cn/RFcyAtp
2、Elastic stack 针对 Azure 云的监控解决方案
http://t.cn/RFc4ew4
3、SpringBoot集成ElasticSearch
http://t.cn/RFcyKM2

活动预告:
1、Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:铭毅天下
归档:https://elasticsearch.cn/article/780
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1、Elasticsearch存储详解
http://t.cn/RFcyAtp
2、Elastic stack 针对 Azure 云的监控解决方案
http://t.cn/RFc4ew4
3、SpringBoot集成ElasticSearch
http://t.cn/RFcyKM2

活动预告:
1、Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:铭毅天下
归档:https://elasticsearch.cn/article/780
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

Curator从入门到实战

Curator 是elasticsearch 官方的一个索引管理工具,可以通过配置文件的方式帮助我们对指定的一批索引进行创建/删除、打开/关闭、快照/恢复等管理操作。

场景

比如,出于读写性能的考虑,我们通常会把基于时间的数据按时间来创建索引。

indices当数据量到达一定量级时,为了节省内存或者磁盘空间,我们往往会根据实际情况选择关闭或者删除一定时间之前的索引。通常我们会写一段脚本调用elasticsearch的api,放到crontab中定期执行。这样虽然可以达到目的,但是脚本多了之后会变得难以维护。

Curator是如何解决这类问题的呢?我们一步一步来:

安装

首先,Curator是基于python实现的,我们可以直接通过pip来安装,这种方式最简单。

pip install elasticsearch-curator

基本配置

接下来,需要为 Curator 配置es连接:

# ~/.curator/curator.yml

client:
  hosts:
    - 127.0.0.1
  port: 9200

logging:
  loglevel: INFO

其中hosts 允许配置多个地址,但是只能属于同一个集群。

这边只列举了最基本的配置,官方文档中包含了更详细的配置。

动作配置

然后需要配置我们需要执行的动作,每个动作会按顺序执行:

# /etc/curator/actions/maintain_log.yml

actions:
  1:
    #创建第二天的索引
    action: create_index
    description: "create new time-based index for log-*"
    options:
      name: '<log-{now/d+1d}>'
  2:
    #删除3天前的索引
    action: delete_indices
    description: "delete outdated indices for log-*"
    filters:
    - filtertype: pattern
      kind: prefix
      value: log
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 3

action 定义了需要执行的动作,curator支持十多种动作,可以在官方文档查看完整的动作列表。

options 定义了执行动作所需的参数,不同动作的参数也不尽相同,具体文档中都有写明。

filters 定义了动作的执行对象,通过设置filter,可以过滤出我们需要操作的索引。同一个action下的filter之间是的关系。比如在上面的定义中,delete_indices下定义了两个filters:

  • 模式匹配:匹配前缀为log的索引
  • “年龄”匹配:根据索引名中“%Y.%m.%d”时间格式,过滤出3天以前的索引

curator支持十多种filter,可以在官方文档查看完整列表。

执行

最后,我们通过curator命令行工具来执行:

curator --config /etc/curator/curator.yml /etc/curator/actions/maintain_log.yml

得到命令行输出:

2018-08-30 12:31:26,829 INFO      Preparing Action ID: 1, "create_index"
2018-08-30 12:31:26,841 INFO      Trying Action ID: 1, "create_index": create new time-based index for log-*
2018-08-30 12:31:26,841 INFO      "<log-{now/d+1d}>" is using Elasticsearch date math.
2018-08-30 12:31:26,841 INFO      Creating index "<log-{now/d+1d}>" with settings: {}
2018-08-30 12:31:27,049 INFO      Action ID: 1, "create_index" completed.
2018-08-30 12:31:27,050 INFO      Preparing Action ID: 2, "delete_indices"
2018-08-30 12:31:27,058 INFO      Trying Action ID: 2, "delete_indices": delete outdated indices for log-*
2018-08-30 12:31:27,119 INFO      Deleting selected indices: ['log-2018.08.24', 'log-2018.08.25', 'log-2018.08.27', 'log-2018.08.26', 'log-2018.08.23']
2018-08-30 12:31:27,119 INFO      ---deleting index log-2018.08.24
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.25
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.27
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.26
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.23
2018-08-30 12:31:27,282 INFO      Action ID: 2, "delete_indices" completed.
2018-08-30 12:31:27,283 INFO      Job completed.

从日志中可以看到,我们已经成功创建了隔天的索引,并删除了28号以前的索引。

定时执行

配置好curator后,还需要配置定时任务

使用crontab -e编辑crontab,

添加一行:

0 23 * * * /usr/local/bin/curator --config /root/.curator/curator.yml /etc/curator/actions/maintain_log.yml >> /var/curator.log 2>&1

crontab配置中的第一段是执行的周期,6个值分别是“分 时 日 月 周”,*表示全部。所以这段配置的含义是在每天23点执行我们的这段脚本。

单个执行

除了定时任务,我们也可以在不依赖action配置文件的情况下用curator执行一些临时的批量操作。curator提供了curator_cli的命令来执行单个action,比如我们想对所有log开头的索引做快照,使用一条命令即可完成:

curator_cli snapshot --repository repo_name --filter_list {"filtertype": "pattern","kind": "prefix", "value": "log"}

是不是特别方便?

执行流程

image-20180830200126973

在命令执行过程中,Curator 会进行以下几步操作:

  1. 从ES拉取所有的索引信息
  2. 根据设置的过滤条件过滤出需要操作的索引
  3. 对过滤后的索引执行指定的动作

复杂需求

实际生产中,会有一些更复杂的需求,简单的action和filter组合并不能满足我们的业务。Curator还提供了python包,方便我们自己写脚本时调用它提供的actions和filters,减少我们的开发工作量。

以上通过一个实际的场景向大家介绍了Curator的使用方式,但是只用到了它一小部分的功能。大家可以通过文中的链接查看官方文档,发掘出更多的使用姿势。希望对大家有所帮助!

elasticTalk,qrcode

继续阅读 »

Curator 是elasticsearch 官方的一个索引管理工具,可以通过配置文件的方式帮助我们对指定的一批索引进行创建/删除、打开/关闭、快照/恢复等管理操作。

场景

比如,出于读写性能的考虑,我们通常会把基于时间的数据按时间来创建索引。

indices当数据量到达一定量级时,为了节省内存或者磁盘空间,我们往往会根据实际情况选择关闭或者删除一定时间之前的索引。通常我们会写一段脚本调用elasticsearch的api,放到crontab中定期执行。这样虽然可以达到目的,但是脚本多了之后会变得难以维护。

Curator是如何解决这类问题的呢?我们一步一步来:

安装

首先,Curator是基于python实现的,我们可以直接通过pip来安装,这种方式最简单。

pip install elasticsearch-curator

基本配置

接下来,需要为 Curator 配置es连接:

# ~/.curator/curator.yml

client:
  hosts:
    - 127.0.0.1
  port: 9200

logging:
  loglevel: INFO

其中hosts 允许配置多个地址,但是只能属于同一个集群。

这边只列举了最基本的配置,官方文档中包含了更详细的配置。

动作配置

然后需要配置我们需要执行的动作,每个动作会按顺序执行:

# /etc/curator/actions/maintain_log.yml

actions:
  1:
    #创建第二天的索引
    action: create_index
    description: "create new time-based index for log-*"
    options:
      name: '<log-{now/d+1d}>'
  2:
    #删除3天前的索引
    action: delete_indices
    description: "delete outdated indices for log-*"
    filters:
    - filtertype: pattern
      kind: prefix
      value: log
    - filtertype: age
      source: name
      direction: older
      timestring: '%Y.%m.%d'
      unit: days
      unit_count: 3

action 定义了需要执行的动作,curator支持十多种动作,可以在官方文档查看完整的动作列表。

options 定义了执行动作所需的参数,不同动作的参数也不尽相同,具体文档中都有写明。

filters 定义了动作的执行对象,通过设置filter,可以过滤出我们需要操作的索引。同一个action下的filter之间是的关系。比如在上面的定义中,delete_indices下定义了两个filters:

  • 模式匹配:匹配前缀为log的索引
  • “年龄”匹配:根据索引名中“%Y.%m.%d”时间格式,过滤出3天以前的索引

curator支持十多种filter,可以在官方文档查看完整列表。

执行

最后,我们通过curator命令行工具来执行:

curator --config /etc/curator/curator.yml /etc/curator/actions/maintain_log.yml

得到命令行输出:

2018-08-30 12:31:26,829 INFO      Preparing Action ID: 1, "create_index"
2018-08-30 12:31:26,841 INFO      Trying Action ID: 1, "create_index": create new time-based index for log-*
2018-08-30 12:31:26,841 INFO      "<log-{now/d+1d}>" is using Elasticsearch date math.
2018-08-30 12:31:26,841 INFO      Creating index "<log-{now/d+1d}>" with settings: {}
2018-08-30 12:31:27,049 INFO      Action ID: 1, "create_index" completed.
2018-08-30 12:31:27,050 INFO      Preparing Action ID: 2, "delete_indices"
2018-08-30 12:31:27,058 INFO      Trying Action ID: 2, "delete_indices": delete outdated indices for log-*
2018-08-30 12:31:27,119 INFO      Deleting selected indices: ['log-2018.08.24', 'log-2018.08.25', 'log-2018.08.27', 'log-2018.08.26', 'log-2018.08.23']
2018-08-30 12:31:27,119 INFO      ---deleting index log-2018.08.24
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.25
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.27
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.26
2018-08-30 12:31:27,120 INFO      ---deleting index log-2018.08.23
2018-08-30 12:31:27,282 INFO      Action ID: 2, "delete_indices" completed.
2018-08-30 12:31:27,283 INFO      Job completed.

从日志中可以看到,我们已经成功创建了隔天的索引,并删除了28号以前的索引。

定时执行

配置好curator后,还需要配置定时任务

使用crontab -e编辑crontab,

添加一行:

0 23 * * * /usr/local/bin/curator --config /root/.curator/curator.yml /etc/curator/actions/maintain_log.yml >> /var/curator.log 2>&1

crontab配置中的第一段是执行的周期,6个值分别是“分 时 日 月 周”,*表示全部。所以这段配置的含义是在每天23点执行我们的这段脚本。

单个执行

除了定时任务,我们也可以在不依赖action配置文件的情况下用curator执行一些临时的批量操作。curator提供了curator_cli的命令来执行单个action,比如我们想对所有log开头的索引做快照,使用一条命令即可完成:

curator_cli snapshot --repository repo_name --filter_list {"filtertype": "pattern","kind": "prefix", "value": "log"}

是不是特别方便?

执行流程

image-20180830200126973

在命令执行过程中,Curator 会进行以下几步操作:

  1. 从ES拉取所有的索引信息
  2. 根据设置的过滤条件过滤出需要操作的索引
  3. 对过滤后的索引执行指定的动作

复杂需求

实际生产中,会有一些更复杂的需求,简单的action和filter组合并不能满足我们的业务。Curator还提供了python包,方便我们自己写脚本时调用它提供的actions和filters,减少我们的开发工作量。

以上通过一个实际的场景向大家介绍了Curator的使用方式,但是只用到了它一小部分的功能。大家可以通过文中的链接查看官方文档,发掘出更多的使用姿势。希望对大家有所帮助!

elasticTalk,qrcode

收起阅读 »

社区日报 第379期 (2018-08-30)

1.OTTO Motors: 使用elastic stack扩展物联网环境
http://t.cn/RF5H9OG
2.ELK构建MySQL慢日志收集平台详解
http://t.cn/Rk7zKT7
3.千亿级数量下日志分析系统的技术架构选型
http://t.cn/RF5HEhS

活动预告:
1.Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2.Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:金桥
归档:https://elasticsearch.cn/article/778
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.OTTO Motors: 使用elastic stack扩展物联网环境
http://t.cn/RF5H9OG
2.ELK构建MySQL慢日志收集平台详解
http://t.cn/Rk7zKT7
3.千亿级数量下日志分析系统的技术架构选型
http://t.cn/RF5HEhS

活动预告:
1.Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2.Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:金桥
归档:https://elasticsearch.cn/article/778
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

社区日报 第378期 (2018-08-29)

1.基于 Elasticsearch 的人才搜索架构
http://t.cn/RKYPGL3 
2.ElasticSearch 深入理解系列
http://t.cn/RF2LdiG 
http://t.cn/RF2zPF9 
http://t.cn/RF2zABQ 
http://t.cn/RF22Efd 
3.使用ELK构建微服务的日志平台
http://t.cn/Rkb1wdM 

1、活动预告:Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html 
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759 

编辑:江水
归档:https://elasticsearch.cn/article/777
订阅:https://tinyletter.com/elastic-daily
 
继续阅读 »
1.基于 Elasticsearch 的人才搜索架构
http://t.cn/RKYPGL3 
2.ElasticSearch 深入理解系列
http://t.cn/RF2LdiG 
http://t.cn/RF2zPF9 
http://t.cn/RF2zABQ 
http://t.cn/RF22Efd 
3.使用ELK构建微服务的日志平台
http://t.cn/Rkb1wdM 

1、活动预告:Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html 
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759 

编辑:江水
归档:https://elasticsearch.cn/article/777
订阅:https://tinyletter.com/elastic-daily
  收起阅读 »

Elastic 中国开发者大会 2018 疯狂来袭!

10月5日,Elastic 正式在纽交所上市了,股票代码 ESTC,当日股票涨幅超过100%,超越14年阿里巴巴,开盘价创有史以来新高。

261538793140_.pic_hd_.jpg

Elastic这么受欢迎,说明大家手里的 Elastic 技术更值钱了,那么在国内的年度开发者交流大会更是不能错过啦,并且现在福利来了,大会门票抢购中,https://www.bagevent.com/event/1654662?discountCode=50OFF 手快有,手慢无啊!

知道 ELK 么?知道 Elasticsearch 么?目前最流行的开源数据库及分析类软件,目前已新晋级到数据库兵器谱排名第七位,搜索引擎排行榜长期霸占第一位,想要了解更多他的本事,快来了解一下他的官方用户大会:Elastic 中国开发者大会,时间2018年11月10日周六,地点深圳金茂 JW 万豪酒店。届时,将有来自 Elastic、eBay、暴雪、Grab、华为、阿里巴巴、顺丰等公司的25位各领域的专家大拿为你带来围绕 Elastic 开源技术的各自精彩干货分享。

640.jpeg

Elastic Stack 作为目前全球最流行的数据搜索与实时分析引擎套件,其产品累计下载次数已超过三亿五千万次,各行各业从一线互联网公司到传统的行业都能找到使用 Elasticsearch 的身影。Elastic 的开源技术正越来越受到众多开发者的青睐,已然成为大数据领域分析工具的最佳选择。

640-1.jpeg

[来自 db-engines.com的最新综合排名]

Elastic 中国开发者大会 2018(Elastic Developers China 2018)是由 Elastic 官方在中国举办的第二次开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

举办 Elastic 开发者大会的目的是为中国广大的 Elastic 开发者提供一个技术交流和学习切磋的地方,汇集业界众多的成功案例,集思广益,发散思维,促进社区和行业的进步。

不管您是 Elasticsearch 的初学者还是资深的用户,您都应该参加!

大会亮点

01 部分精彩议题

  1. Beats 创始人 Monica Sarbu 带来的运维分析的三连击

  2. 新产品 Codesearch(原 Insight.io) 的初次亮相

  3. Elastic 内部是如何使用 Elastic 产品的案例

  4. 暴雪中国借助 ELK 运营游戏的经验分享

  5. 东南亚打车软件 Grab 的 POI 搜索平台迁移史

  6. 东半球对 Kibana 二次开发最多团队带来的经验分享

  7. 千亿数据规模下的 Elasticsearch 深度应用

  8. Elasticsearch 和 AI 的深度结合与用户画像系统

更多在互联网、证券、快递、新零售、安全等领域的分享,点击这里了解更多

02 部分嘉宾阵容

640-2.jpeg

640-3.jpeg

03 Elastic AMA 展台

640-4.jpeg

AMA 即 Ask Me Anything,意思是尽管随便问,您可以在大会当天,尽情的在现场咨询 Elastic 官方工作人员任意的问题,可以是技术的咨询,可以是特性的讲解,可以是最佳实践,可以是商务合作。AMA 展台,您一定不要错过。

04 Elastic Demo 展台

640-5.jpeg

如果您对 Elastic 能够帮您做哪些事情比较感兴趣,最直观的方式就是来到 Elastic 的 Demo 展台,现场有 Elastic 技术专家为您讲解各种酷炫的 Demo 以及具体的如何使用 Elastic Stack 来完成特定的任务。 Demo 展台有趣又好玩,记得打卡。

05 闪电演讲

640-6.jpeg

您也来讲讲,大会的最后一个环节名叫闪电演讲,参会者可以现场报名,每位分享者可以有5分钟的时间来进行分享,可以是任何相关的话题,可以是 Demo 演示,可以是技术脱口秀,或是您的一个开源的项目,名额有限,先报先得。

最后,赶紧报名吧! https://www.bagevent.com/event/1654662?discountCode=50OFF

继续阅读 »

10月5日,Elastic 正式在纽交所上市了,股票代码 ESTC,当日股票涨幅超过100%,超越14年阿里巴巴,开盘价创有史以来新高。

261538793140_.pic_hd_.jpg

Elastic这么受欢迎,说明大家手里的 Elastic 技术更值钱了,那么在国内的年度开发者交流大会更是不能错过啦,并且现在福利来了,大会门票抢购中,https://www.bagevent.com/event/1654662?discountCode=50OFF 手快有,手慢无啊!

知道 ELK 么?知道 Elasticsearch 么?目前最流行的开源数据库及分析类软件,目前已新晋级到数据库兵器谱排名第七位,搜索引擎排行榜长期霸占第一位,想要了解更多他的本事,快来了解一下他的官方用户大会:Elastic 中国开发者大会,时间2018年11月10日周六,地点深圳金茂 JW 万豪酒店。届时,将有来自 Elastic、eBay、暴雪、Grab、华为、阿里巴巴、顺丰等公司的25位各领域的专家大拿为你带来围绕 Elastic 开源技术的各自精彩干货分享。

640.jpeg

Elastic Stack 作为目前全球最流行的数据搜索与实时分析引擎套件,其产品累计下载次数已超过三亿五千万次,各行各业从一线互联网公司到传统的行业都能找到使用 Elasticsearch 的身影。Elastic 的开源技术正越来越受到众多开发者的青睐,已然成为大数据领域分析工具的最佳选择。

640-1.jpeg

[来自 db-engines.com的最新综合排名]

Elastic 中国开发者大会 2018(Elastic Developers China 2018)是由 Elastic 官方在中国举办的第二次开发者大会,主要围绕 Elastic 的开源产品: Elasticsearch、Logstash、Kibana 和 Beats,探讨在搜索、数据实时分析、日志分析、安全等领域的实践与应用。

举办 Elastic 开发者大会的目的是为中国广大的 Elastic 开发者提供一个技术交流和学习切磋的地方,汇集业界众多的成功案例,集思广益,发散思维,促进社区和行业的进步。

不管您是 Elasticsearch 的初学者还是资深的用户,您都应该参加!

大会亮点

01 部分精彩议题

  1. Beats 创始人 Monica Sarbu 带来的运维分析的三连击

  2. 新产品 Codesearch(原 Insight.io) 的初次亮相

  3. Elastic 内部是如何使用 Elastic 产品的案例

  4. 暴雪中国借助 ELK 运营游戏的经验分享

  5. 东南亚打车软件 Grab 的 POI 搜索平台迁移史

  6. 东半球对 Kibana 二次开发最多团队带来的经验分享

  7. 千亿数据规模下的 Elasticsearch 深度应用

  8. Elasticsearch 和 AI 的深度结合与用户画像系统

更多在互联网、证券、快递、新零售、安全等领域的分享,点击这里了解更多

02 部分嘉宾阵容

640-2.jpeg

640-3.jpeg

03 Elastic AMA 展台

640-4.jpeg

AMA 即 Ask Me Anything,意思是尽管随便问,您可以在大会当天,尽情的在现场咨询 Elastic 官方工作人员任意的问题,可以是技术的咨询,可以是特性的讲解,可以是最佳实践,可以是商务合作。AMA 展台,您一定不要错过。

04 Elastic Demo 展台

640-5.jpeg

如果您对 Elastic 能够帮您做哪些事情比较感兴趣,最直观的方式就是来到 Elastic 的 Demo 展台,现场有 Elastic 技术专家为您讲解各种酷炫的 Demo 以及具体的如何使用 Elastic Stack 来完成特定的任务。 Demo 展台有趣又好玩,记得打卡。

05 闪电演讲

640-6.jpeg

您也来讲讲,大会的最后一个环节名叫闪电演讲,参会者可以现场报名,每位分享者可以有5分钟的时间来进行分享,可以是任何相关的话题,可以是 Demo 演示,可以是技术脱口秀,或是您的一个开源的项目,名额有限,先报先得。

最后,赶紧报名吧! https://www.bagevent.com/event/1654662?discountCode=50OFF

收起阅读 »

听说你还没掌握 Normalizer 的使用方法?

在 Elasticsearch 中处理字符串类型的数据时,如果我们想把整个字符串作为一个完整的 term 存储,我们通常会将其类型 type 设定为 keyword。但有时这种设定又会给我们带来麻烦,比如同一个数据再写入时由于没有做好清洗,导致大小写不一致,比如 appleApple两个实际都是 apple,但当我们去搜索 apple时却无法返回 Apple的文档。要解决这个问题,就需要 Normalizer出场了。废话不多说,直接上手看!

1. 上手

我们先来重现一下开篇的问题

PUT test_normalizer
{
  "mappings": {
    "doc":{
      "properties": {
        "type":{
          "type":"keyword"
        }
      }
    }
  }
}

PUT test_normalizer/doc/1
{
  "type":"apple"
}

PUT test_normalizer/doc/2
{
  "type":"Apple"
}

# 查询一 
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"apple"
    }
  }
}

# 查询二
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"aPple"
    }
  }
}

大家执行后会发现 查询一返回了文档1,而 查询二没有文档返回,原因如下图所示:

  1. Docs写入 Elasticsearch时由于 typekeyword,分词结果为原始字符串
  2. 查询 Query 时分词默认是采用和字段写时相同的配置,因此这里也是 keyword,因此分词结果也是原始字符
  3. 两边的分词进行匹对,便得出了我们上面的结果

2. Normalizer

normalizerkeyword的一个属性,可以对 keyword生成的单一 Term再做进一步的处理,比如 lowercase,即做小写变换。使用方法和自定义分词器有些类似,需要自定义,如下所示:

DELETE test_normalizer
# 自定义 normalizer
PUT test_normalizer
{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "type_normalizer": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
      }
    }
  }
}

PUT test_normalizer/doc/1
{
  "type": "apple",
  "type_normalizer": "apple"
}

PUT test_normalizer/doc/2
{
  "type": "Apple",
  "type_normalizer": "Apple"
}
# 查询三
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type":"aPple"
    }
  }
}

# 查询四
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type_normalizer":"aPple"
    }
  }
}

我们第一步是自定义了名为 lowercase的 normalizer,其中filter 类似自定义分词器中的 filter ,但是可用的种类很少,详情大家可以查看官方文档。然后通过 normalizer属性设定到字段type_normalizer中,然后插入相同的2条文档。执行发现,查询三无结果返回,查询四返回2条文档。

问题解决了!我们来看下是如何解决的

  1. 文档写入时由于加入了 normalizer,所有的 term都会被做小写处理
  2. 查询时搜索词同样采用有 normalizer的配置,因此处理后的 term也是小写的
  3. 两边分词匹对,就得到了我们上面的结果

3. 总结

本文通过一个实例来给大家讲解了 Normalizer的实际使用场景,希望对大家有所帮助!

继续阅读 »

在 Elasticsearch 中处理字符串类型的数据时,如果我们想把整个字符串作为一个完整的 term 存储,我们通常会将其类型 type 设定为 keyword。但有时这种设定又会给我们带来麻烦,比如同一个数据再写入时由于没有做好清洗,导致大小写不一致,比如 appleApple两个实际都是 apple,但当我们去搜索 apple时却无法返回 Apple的文档。要解决这个问题,就需要 Normalizer出场了。废话不多说,直接上手看!

1. 上手

我们先来重现一下开篇的问题

PUT test_normalizer
{
  "mappings": {
    "doc":{
      "properties": {
        "type":{
          "type":"keyword"
        }
      }
    }
  }
}

PUT test_normalizer/doc/1
{
  "type":"apple"
}

PUT test_normalizer/doc/2
{
  "type":"Apple"
}

# 查询一 
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"apple"
    }
  }
}

# 查询二
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"aPple"
    }
  }
}

大家执行后会发现 查询一返回了文档1,而 查询二没有文档返回,原因如下图所示:

  1. Docs写入 Elasticsearch时由于 typekeyword,分词结果为原始字符串
  2. 查询 Query 时分词默认是采用和字段写时相同的配置,因此这里也是 keyword,因此分词结果也是原始字符
  3. 两边的分词进行匹对,便得出了我们上面的结果

2. Normalizer

normalizerkeyword的一个属性,可以对 keyword生成的单一 Term再做进一步的处理,比如 lowercase,即做小写变换。使用方法和自定义分词器有些类似,需要自定义,如下所示:

DELETE test_normalizer
# 自定义 normalizer
PUT test_normalizer
{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "type_normalizer": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
      }
    }
  }
}

PUT test_normalizer/doc/1
{
  "type": "apple",
  "type_normalizer": "apple"
}

PUT test_normalizer/doc/2
{
  "type": "Apple",
  "type_normalizer": "Apple"
}
# 查询三
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type":"aPple"
    }
  }
}

# 查询四
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type_normalizer":"aPple"
    }
  }
}

我们第一步是自定义了名为 lowercase的 normalizer,其中filter 类似自定义分词器中的 filter ,但是可用的种类很少,详情大家可以查看官方文档。然后通过 normalizer属性设定到字段type_normalizer中,然后插入相同的2条文档。执行发现,查询三无结果返回,查询四返回2条文档。

问题解决了!我们来看下是如何解决的

  1. 文档写入时由于加入了 normalizer,所有的 term都会被做小写处理
  2. 查询时搜索词同样采用有 normalizer的配置,因此处理后的 term也是小写的
  3. 两边分词匹对,就得到了我们上面的结果

3. 总结

本文通过一个实例来给大家讲解了 Normalizer的实际使用场景,希望对大家有所帮助!

收起阅读 »

社区日报 第377期 (2018-08-28)

1.在Elasticsearch Service上部署hot-warm-logging 集群。
http://t.cn/RksKnp8
2.Elasticsearch6.4尝新和骚动的Redis。
http://t.cn/RksKey6
3.LEAISTIC:管理Elasticsearch的微服务库。
http://t.cn/Rks9Pw7

1、活动预告:Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:叮咚光军
归档:https://elasticsearch.cn/article/774
订阅:https://tinyletter.com/elastic-daily
 
继续阅读 »
1.在Elasticsearch Service上部署hot-warm-logging 集群。
http://t.cn/RksKnp8
2.Elasticsearch6.4尝新和骚动的Redis。
http://t.cn/RksKey6
3.LEAISTIC:管理Elasticsearch的微服务库。
http://t.cn/Rks9Pw7

1、活动预告:Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:叮咚光军
归档:https://elasticsearch.cn/article/774
订阅:https://tinyletter.com/elastic-daily
  收起阅读 »

社区日报 第376期 (2018-08-27)

1、elastic 官方韩语分析器
http://t.cn/RkdWBXP
2、(自备梯子)运行和扩展巨大的es集群
http://t.cn/RkgA6dF
3、跟随elastic解决方案架构团队成员,了解elastic stack架构最佳实践
http://t.cn/RkdT4CC

活动预告:
1、Elastic Meetup 北京线下沙龙征稿中
https://elasticsearch.cn/article/759
2、Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作
https://conf.elasticsearch.cn/2018/shenzhen.html

编辑:cyberdak
归档:https://elasticsearch.cn/article/773
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1、elastic 官方韩语分析器
http://t.cn/RkdWBXP
2、(自备梯子)运行和扩展巨大的es集群
http://t.cn/RkgA6dF
3、跟随elastic解决方案架构团队成员,了解elastic stack架构最佳实践
http://t.cn/RkdT4CC

活动预告:
1、Elastic Meetup 北京线下沙龙征稿中
https://elasticsearch.cn/article/759
2、Elastic 中国开发者大会 2018 ,开始接受演讲申请和赞助合作
https://conf.elasticsearch.cn/2018/shenzhen.html

编辑:cyberdak
归档:https://elasticsearch.cn/article/773
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

​社区日报 第375期 (2018-08-26)

1.Kibana高级搜索入门。
http://t.cn/Rk1SYUC
2.(自备梯子)四大NoSQL数据库。
http://t.cn/Rk1anR2
3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。
http://t.cn/Rk1abPX

活动预告:
1、Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:至尊宝
归档:https://elasticsearch.cn/article/772
订阅:https://tinyletter.com/elastic-daily
继续阅读 »
1.Kibana高级搜索入门。
http://t.cn/Rk1SYUC
2.(自备梯子)四大NoSQL数据库。
http://t.cn/Rk1anR2
3.(自备梯子)您必须在“按时交付的软件”和“良好软件”之间进行选择。
http://t.cn/Rk1abPX

活动预告:
1、Elastic 中国开发者大会最后一波早鸟票发售进行中
https://conf.elasticsearch.cn/2018/shenzhen.html
2、Elastic Meetup 9月8日 北京线下沙龙正在报名中
https://elasticsearch.cn/article/759

编辑:至尊宝
归档:https://elasticsearch.cn/article/772
订阅:https://tinyletter.com/elastic-daily 收起阅读 »

掌握 analyze API,一举搞定 Elasticsearch 分词难题

初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景:

  1. 为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢?
  2. 我存进去的文档到底被分成哪些词(term)了?
  3. 我得自定义分词规则,但感觉好麻烦呢,无从下手

如果你遇到过类似的问题,希望本文可以解决你的疑惑。

1. 上手

让我们从一个实例出发,如下创建一个文档:

PUT test/doc/1
{
  "msg":"Eating an apple a day keeps doctor away"
}

然后我们做一个查询,我们试图通过搜索 eat这个关键词来搜索这个文档

POST test/_search
{
  "query":{
    "match":{
      "msg":"eat"
    }
  }
}

ES的返回结果为0。这不太对啊,我们用最基本的字符串查找也应该能匹配到上面新建的文档才对啊!

各位不要急,我们先来看看什么是分词。

2. 分词

搜索引擎的核心是倒排索引(这里不展开讲),而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。在 es 中单词对应英文为 term。我们简单看个例子:

ES 的倒排索引即是根据分词后的单词创建,即 北京天安门这4个单词。这也意味着你在搜索的时候也只能搜索这4个单词才能命中该文档。

实际上 ES 的分词不仅仅发生在文档创建的时候,也发生在搜索的时候,如下图所示:

读时分词发生在用户查询时,ES 会即时地对用户输入的关键词进行分词,分词结果只存在内存中,当查询结束时,分词结果也会随即消失。而写时分词发生在文档写入时,ES 会对文档进行分词后,将结果存入倒排索引,该部分最终会以文件的形式存储于磁盘上,不会因查询结束或者 ES 重启而丢失。

ES 中处理分词的部分被称作分词器,英文是Analyzer,它决定了分词的规则。ES 自带了很多默认的分词器,比如StandardKeywordWhitespace等等,默认是 Standard。当我们在读时或者写时分词时可以指定要使用的分词器。

3. 写时分词结果

回到上手阶段,我们来看下写入的文档最终分词结果是什么。通过如下 api 可以查看:

POST test/_analyze
{
  "field": "msg",
  "text": "Eating an apple a day keeps doctor away"
}

其中 test为索引名,_analyze 为查看分词结果的 endpoint,请求体中 field 为要查看的字段名,text为具体值。该 api 的作用就是请告诉我在 test 索引使用 msg 字段存储一段文本时,es 会如何分词。

返回结果如下:

{
  "tokens": [
    {
      "token": "eating",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "an",
      "start_offset": 7,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "apple",
      "start_offset": 10,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "a",
      "start_offset": 16,
      "end_offset": 17,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "day",
      "start_offset": 18,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "keeps",
      "start_offset": 22,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "doctor",
      "start_offset": 28,
      "end_offset": 34,
      "type": "<ALPHANUM>",
      "position": 6
    },
    {
      "token": "away",
      "start_offset": 35,
      "end_offset": 39,
      "type": "<ALPHANUM>",
      "position": 7
    }
  ]
}

返回结果中的每一个 token即为分词后的每一个单词,我们可以看到这里是没有 eat 这个单词的,这也解释了在上手中我们搜索 eat 没有结果的情况。如果你去搜索 eating ,会有结果返回。

写时分词器需要在 mapping 中指定,而且一经指定就不能再修改,若要修改必须新建索引。如下所示我们新建一个名为ms_english 的字段,指定其分词器为 english

PUT test/_mapping/doc
{
  "properties": {
    "msg_english":{
      "type":"text",
      "analyzer": "english"
    }
  }
}

4. 读时分词结果

由于读时分词器默认与写时分词器默认保持一致,拿 上手 中的例子,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_english 时分词器则为 english。这种默认设定也是非常容易理解的,读写采用一致的分词器,才能尽最大可能保证分词的结果是可以匹配的。

然后 ES 允许读时分词器单独设置,如下所示:

POST test/_search
  {
    "query":{
      "match":{
        "msg":{
          "query": "eating",
          "analyzer": "english"
        }
      }
    }
  }

如上 analyzer 字段即可以自定义读时分词器,一般来讲不需要特别指定读时分词器。

如果不单独设置分词器,那么读时分词器的验证方法与写时一致;如果是自定义分词器,那么可以使用如下的 api 来自行验证结果。

POST _analyze
  {
    "text":"eating",
    "analyzer":"english"
  }

返回结果如下:

{
  "tokens": [
    {
      "token": "eat",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

由上可知 english分词器会将 eating处理为 eat,大家可以再测试下默认的 standard分词器,它没有做任何处理。

5. 解释问题

现在我们再来看下 上手 中所遇问题的解决思路。

  1. 查看文档写时分词结果
  2. 查看查询关键词的读时分词结果
  3. 匹对两者是否有命中

我们简单分析如下:

由上图可以定位问题的原因了。

6. 解决需求

由于 eating只是 eat的一个变形,我们依然希望输入 eat时可以匹配包含 eating的文档,那么该如何解决呢?

答案很简单,既然原因是在分词结果不匹配,那么我们就换一个分词器呗~ 我们可以先试下 ES 自带的 english分词器,如下:

# 增加字段 msg_english,与 msg 做对比
PUT test/_mapping/doc
{
  "properties": {
    "msg_english":{
      "type":"text",
      "analyzer": "english"
    }
  }
}

# 写入相同文档
PUT test/doc/1
{
  "msg":"Eating an apple a day keeps doctor away",
  "msg_english":"Eating an apple a day keeps doctor away"
}

# 搜索 msg_english 字段
POST test/_search
{
  "query": {
    "match": {
      "msg_english": "eat"
    }
  }
}

执行上面的内容,我们会发现结果有内容了,原因也很简单,如下图所示:

由上图可见 english分词器会将 eating分词为 eat,此时我们搜索 eat或者 eating肯定都可以匹配对应的文档了。至此,需求解决。

7. 深入分析

最后我们来看下为什么english分词器可以解决我们遇到的问题。一个分词器由三部分组成:char filter、tokenizer 和 token filter。各部分的作用我们这里就不展开了,我们来看下 standardenglish分词器的区别。

从上图可以看出,english分词器在 Token Filter 中和 Standard不同,而发挥主要作用的就是 stemmer,感兴趣的同学可以自行去看起它的作用。

8. 自定义分词

如果我们不使用 english分词器,自定义一个分词器来实现上述需求也是完全可行的,这里不详细讲解了,只给大家讲一个快速验证自定义分词器效果的方法,如下:

POST _analyze
{
  "char_filter": [], 
  "tokenizer": "standard",
  "filter": [
    "stop",
    "lowercase",
    "stemmer"
  ],
  "text": "Eating an apple a day keeps doctor away"
}

通过上面的 api 你可以快速验证自己要定制的分词器,当达到自己需求后,再将这一部分配置加入索引的配置。

至此,我们再看开篇的三个问题,相信你已经心里有答案了,赶紧上手去自行测试下吧!

继续阅读 »

初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景:

  1. 为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢?
  2. 我存进去的文档到底被分成哪些词(term)了?
  3. 我得自定义分词规则,但感觉好麻烦呢,无从下手

如果你遇到过类似的问题,希望本文可以解决你的疑惑。

1. 上手

让我们从一个实例出发,如下创建一个文档:

PUT test/doc/1
{
  "msg":"Eating an apple a day keeps doctor away"
}

然后我们做一个查询,我们试图通过搜索 eat这个关键词来搜索这个文档

POST test/_search
{
  "query":{
    "match":{
      "msg":"eat"
    }
  }
}

ES的返回结果为0。这不太对啊,我们用最基本的字符串查找也应该能匹配到上面新建的文档才对啊!

各位不要急,我们先来看看什么是分词。

2. 分词

搜索引擎的核心是倒排索引(这里不展开讲),而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。在 es 中单词对应英文为 term。我们简单看个例子:

ES 的倒排索引即是根据分词后的单词创建,即 北京天安门这4个单词。这也意味着你在搜索的时候也只能搜索这4个单词才能命中该文档。

实际上 ES 的分词不仅仅发生在文档创建的时候,也发生在搜索的时候,如下图所示:

读时分词发生在用户查询时,ES 会即时地对用户输入的关键词进行分词,分词结果只存在内存中,当查询结束时,分词结果也会随即消失。而写时分词发生在文档写入时,ES 会对文档进行分词后,将结果存入倒排索引,该部分最终会以文件的形式存储于磁盘上,不会因查询结束或者 ES 重启而丢失。

ES 中处理分词的部分被称作分词器,英文是Analyzer,它决定了分词的规则。ES 自带了很多默认的分词器,比如StandardKeywordWhitespace等等,默认是 Standard。当我们在读时或者写时分词时可以指定要使用的分词器。

3. 写时分词结果

回到上手阶段,我们来看下写入的文档最终分词结果是什么。通过如下 api 可以查看:

POST test/_analyze
{
  "field": "msg",
  "text": "Eating an apple a day keeps doctor away"
}

其中 test为索引名,_analyze 为查看分词结果的 endpoint,请求体中 field 为要查看的字段名,text为具体值。该 api 的作用就是请告诉我在 test 索引使用 msg 字段存储一段文本时,es 会如何分词。

返回结果如下:

{
  "tokens": [
    {
      "token": "eating",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "an",
      "start_offset": 7,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "apple",
      "start_offset": 10,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "a",
      "start_offset": 16,
      "end_offset": 17,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "day",
      "start_offset": 18,
      "end_offset": 21,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "keeps",
      "start_offset": 22,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "doctor",
      "start_offset": 28,
      "end_offset": 34,
      "type": "<ALPHANUM>",
      "position": 6
    },
    {
      "token": "away",
      "start_offset": 35,
      "end_offset": 39,
      "type": "<ALPHANUM>",
      "position": 7
    }
  ]
}

返回结果中的每一个 token即为分词后的每一个单词,我们可以看到这里是没有 eat 这个单词的,这也解释了在上手中我们搜索 eat 没有结果的情况。如果你去搜索 eating ,会有结果返回。

写时分词器需要在 mapping 中指定,而且一经指定就不能再修改,若要修改必须新建索引。如下所示我们新建一个名为ms_english 的字段,指定其分词器为 english

PUT test/_mapping/doc
{
  "properties": {
    "msg_english":{
      "type":"text",
      "analyzer": "english"
    }
  }
}

4. 读时分词结果

由于读时分词器默认与写时分词器默认保持一致,拿 上手 中的例子,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_english 时分词器则为 english。这种默认设定也是非常容易理解的,读写采用一致的分词器,才能尽最大可能保证分词的结果是可以匹配的。

然后 ES 允许读时分词器单独设置,如下所示:

POST test/_search
  {
    "query":{
      "match":{
        "msg":{
          "query": "eating",
          "analyzer": "english"
        }
      }
    }
  }

如上 analyzer 字段即可以自定义读时分词器,一般来讲不需要特别指定读时分词器。

如果不单独设置分词器,那么读时分词器的验证方法与写时一致;如果是自定义分词器,那么可以使用如下的 api 来自行验证结果。

POST _analyze
  {
    "text":"eating",
    "analyzer":"english"
  }

返回结果如下:

{
  "tokens": [
    {
      "token": "eat",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

由上可知 english分词器会将 eating处理为 eat,大家可以再测试下默认的 standard分词器,它没有做任何处理。

5. 解释问题

现在我们再来看下 上手 中所遇问题的解决思路。

  1. 查看文档写时分词结果
  2. 查看查询关键词的读时分词结果
  3. 匹对两者是否有命中

我们简单分析如下:

由上图可以定位问题的原因了。

6. 解决需求

由于 eating只是 eat的一个变形,我们依然希望输入 eat时可以匹配包含 eating的文档,那么该如何解决呢?

答案很简单,既然原因是在分词结果不匹配,那么我们就换一个分词器呗~ 我们可以先试下 ES 自带的 english分词器,如下:

# 增加字段 msg_english,与 msg 做对比
PUT test/_mapping/doc
{
  "properties": {
    "msg_english":{
      "type":"text",
      "analyzer": "english"
    }
  }
}

# 写入相同文档
PUT test/doc/1
{
  "msg":"Eating an apple a day keeps doctor away",
  "msg_english":"Eating an apple a day keeps doctor away"
}

# 搜索 msg_english 字段
POST test/_search
{
  "query": {
    "match": {
      "msg_english": "eat"
    }
  }
}

执行上面的内容,我们会发现结果有内容了,原因也很简单,如下图所示:

由上图可见 english分词器会将 eating分词为 eat,此时我们搜索 eat或者 eating肯定都可以匹配对应的文档了。至此,需求解决。

7. 深入分析

最后我们来看下为什么english分词器可以解决我们遇到的问题。一个分词器由三部分组成:char filter、tokenizer 和 token filter。各部分的作用我们这里就不展开了,我们来看下 standardenglish分词器的区别。

从上图可以看出,english分词器在 Token Filter 中和 Standard不同,而发挥主要作用的就是 stemmer,感兴趣的同学可以自行去看起它的作用。

8. 自定义分词

如果我们不使用 english分词器,自定义一个分词器来实现上述需求也是完全可行的,这里不详细讲解了,只给大家讲一个快速验证自定义分词器效果的方法,如下:

POST _analyze
{
  "char_filter": [], 
  "tokenizer": "standard",
  "filter": [
    "stop",
    "lowercase",
    "stemmer"
  ],
  "text": "Eating an apple a day keeps doctor away"
}

通过上面的 api 你可以快速验证自己要定制的分词器,当达到自己需求后,再将这一部分配置加入索引的配置。

至此,我们再看开篇的三个问题,相信你已经心里有答案了,赶紧上手去自行测试下吧!

收起阅读 »

社区日报 第374期 (2018-08-25)

  1. ES6.4发布。 http://t.cn/RkHPfV6

  2. 在Django项目中使用es。 http://t.cn/RkR2as4

  3. ElasticHQ: 基于python的es监控管理插件。 http://t.cn/Rk8ioV0

活动预告

1、Elastic 中国开发者大会最后一波早鸟票发售进行中

https://conf.elasticsearch.cn/2018/shenzhen.html

2、Elastic Meetup 9月8日 北京线下沙龙正在报名中

https://elasticsearch.cn/article/759

继续阅读 »
  1. ES6.4发布。 http://t.cn/RkHPfV6

  2. 在Django项目中使用es。 http://t.cn/RkR2as4

  3. ElasticHQ: 基于python的es监控管理插件。 http://t.cn/Rk8ioV0

活动预告

1、Elastic 中国开发者大会最后一波早鸟票发售进行中

https://conf.elasticsearch.cn/2018/shenzhen.html

2、Elastic Meetup 9月8日 北京线下沙龙正在报名中

https://elasticsearch.cn/article/759

收起阅读 »