新手问题 关于 ElasticSearch 的疑惑

xiaobai2 · 2016年11月29日 · 最后由 xiaobai2 回复于 2016年12月01日 · 2292 次阅读

最近项目里边用到 es,Gemfile 里边相关 gem 如下

gem 'elasticsearch'
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
gem 'elasticsearch-persistence'
gem 'searchkick'

自己大概捋了一下

es-model: 主要和 orm 整合的 (ActiveRecord 或者 MongoId)

es-rails: 集成了 rails 的各种功能

es-persistence: elasticsearch-persistence 是为 ruby 对象提供了持久层。什么?! 持久层!rails 不是有自己的持久层 ActiveRecord 吗?用了 es-persistence 之后会和 ActiveRecord 处于什么关系?难道是为了解决 es 和 rails 程序之间的持久关系吗?

searchkick:是不是在 model 层引入 searchkick 之后并且把 model 的数据 reindex 到 es 中就可以用如下语法检索 es 了

Model.search "wingtips", where: {color: "brandy"}

但是下边这段 es 检索代码又是用了哪个插件?(这是因为没用 searchkick 的原因吗?)

Model.__elasticsearch__.search(query)

它们的世界太乱,我已懵逼😮 我感觉以这种状态去看文档很吃力,所以哪位大牛出来救急一下,大概理一下它们之间的关系和作用

没人搭理哎

Searchkick 是将 Elasticsearch 集成到 Rails 的一个 gem, 大部分功能和你另外提到的那些 elasticsearch-xxxxx 差不多, 可能有一些差异, 但是要在 Rails 里用 Elasticsearch 的话一般选官方的 elasticsearch-xxxx 那几个或者单独只要一个 Searchkick 就可以了, 用不着都加到 Gemfile

一般而言,

gem 'elasticsearch-model'
gem 'elasticsearch-rails'

# - OR - 

gem 'searchkick'

elasticsearch-persistence 用的少, 看文档的说明像是用在一些 PORO 上, 而不是 ActiveRecord 的对象上

也就是说我想用 es 做搜索的话有你说的如上两个方案 但是如果用第一个方案的话类似 Model.reindex 一样把数据导入到 es 中,另外这两种方案是怎么做到 rails 层和 es 的数据同步的

es-persistence: elasticsearch-persistence 是为 ruby 对象提供了持久层。什么?! 持久层!rails 不是有自己的持久层 ActiveRecord 吗?用了 es-persistence 之后会和 ActiveRecord 处于什么关系?难道是为了解决 es 和 rails 程序之间的持久关系吗?

其实你可以把 elasticsearch 看成一个自带全文检索的数据库。我们把需要检索的数据存到这个数据库里(比如你的文章,用户信息),这个数据库就可以帮我们建立各种索引,还提供给我们 restful api 检索我们存放进去的内容。

#4 楼 @gyorou 大概知道了,怎么做到把需要的数据实时的保存到 es 里边

其实,你可以看一下 Ruby China 的源代码,它就是用的 Elasticsearch,看看它怎么用的 Elasticsearch,在 Model 里做了什么,Gemfile 里用了那几个 gem 就知道了。再看看官方的文档就知道了。

#6 楼 @tesla_lee 好吧,老老实实去码代码咯😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册