CrowdWorks使用Elasticsearch技术

这篇文章是CrowdWorks Advent Calendar 2016第15天的文章。

我想介绍一下关于在CrowdWorks上使用Elasticsearch的情况。

首先

CrowdWorks是一个使用Rails开发的工作匹配服务。当工作者想要找工作或者客户想要找工作者时,我们使用Elasticsearch进行搜索。

job_offer-search-half.png

搜索目标数据被持久化在MySQL(Amazon RDS)中,并以同步到Elasticsearch的方式进行利用。

弹性搜索的运营

我們使用Elastic Cloud來運營Elasticsearch。

在浏览器中轻松设置扩展、管理集群的扩容和版本升级,以及进行插件和安全设置非常方便。

Elastic_Cloud 4.png

由于 Elastic 是本公司的服务,因此一旦有新版本发布,您几乎可以立即开始使用(目前可用的最新版本是5.1.1)。

尽管支持只提供英语,但如果您问问题,他们会认真对待。最近,Elasticsearch连接时偶尔出现HTTP状态502等问题,由于我们无法解决,所以向他们咨询后,他们进行了调查并修复了连接问题。

我們也通過支持的方式,請求能夠上傳使用者字典。在Elastic公司內部,似乎正在考慮是否應該在所有帳戶中默認啟用,但目前似乎還沒有具體的處理方案(參考)。

升级时的注意事项

在UI上方便地进行版本升级是很方便的,但是一旦执行,即使是较小的升级也可能导致服务断连,因此是危险的。实际上,就在前几天,我在升级从版本2.4.1到2.4.2时不小心犯了这个错误,导致服务不可用约10秒至1分钟左右。

Elastic_Cloud.png

※补充:据Elastic Cloud工程师所说,通常情况下不会在较小的版本更新中发生此问题,请在论坛上提问以进行原因调查。

Rails应用程序的实施

在Rails中使用Elasticsearch是通过elasticsearch-rails和elasticsearch-model来实现的。
特别是通过elasticsearch-model定义映射,可以方便地反映映射作为元数据,并一致性地使用该映射进行实际数据的注册。

数据更新与同步

如果搜索目标的数据被更新,每次更新记录都会与Elasticsearch同步。
注册一个用于更新的任务,并由与应用程序不同的工作进程来执行该任务。

遅延同期.png

由于以上同步可能会出现问题,我们会检查数据是否被正确同步,并定期运行同步批处理(每20分钟一次)来确保同步。目前的数据同步大部分依赖于这个过程。

地图更新

如果想要添加搜索字段或更新映射等,需要重新创建索引,因此应用程序在不直接引用索引名称的情况下,引用别名(索引名称带有时间戳)。

エイリアス参照.png

通过更改映射而重新创建索引的过程在脚本中进行如下处理。

    • 新しいマッピングで新たにインデックスを作る(データはMySQLから同期)

このとき開始時間を記憶しておく

インデックス生成がおわったらエイリアスを新インデックスを指すようにする
新インデックス作成開始時点から更新されたレコードがないかをチェックし、更新されたレコードは新インデックスに反映させる
すぐ検索できるようRefreshを実行する

执行搜索

在搜索方面,我们使用了kuromoji插件来进行关键字搜索以及其他筛选条件,这是一个简单的方法,我们之前没有进行特别的调整。
目前我们正在继续提高得分和用户自定义字典来提升搜索准确性,如果有任何成果,我们会再次介绍给大家。

此外,当前存在的问题是条件的数量和组合增加,导致维护变得更加困难。

总结

我很简单地介绍了CrowdWorks使用Elasticsearch的情况。

明天是由@oura先生领导的“多功能团队”,请多多关照。

广告
将在 10 秒后关闭
bannerAds