【问题标题】:how to use Tire for getting data from Elasticsearch index and without hitting database如何使用 Tire 从 Elasticsearch 索引中获取数据而不访问数据库
【发布时间】:2013-05-25 20:33:18
【问题描述】:

我正在使用 Tire 来实现 Elasticsearch。我的环境是 Linux,Rails 3.2 和 Ruby 1.9.3。 我可以在 gem Tire(0.5.8) 的帮助下使用 Elasticsearch 进行索引。 但现在为了提高性能,我想从索引数据中显示数据而不是命中数据库(我只想将 db 用于 INSERT 和 UPDATE)。

为了实现这一点,我使用以下代码:

result = Tire.search 'jobs', load: true do

  query do
    string "is_active:1"
  end
  filter :range,  status: {gte: 0 }
  sort { by :created_at, 'desc' }
 end

  return result.results

由于我使用的是 load:true,它会命中我不想要的数据库(MySQL)。但是我正在删除 load 属性,然后它没有给我任何结果。 我能够检查提到的表的所有列是否都已编入索引(“xxx:9200/jobs/_mapping?pretty=1”)。

请建议我如何实现它。

谢谢。

【问题讨论】:

  • result.inspect 返回什么?
  • 感谢@concept47 的响应。现在我可以用弹性模型代替 ActiveRecord。返回的 result.inspect 如下所述: #<:search::search:0x8a1a4d4>false, :page =>1, :per_page=>20}, @path=\"/jobs/_search\", @query=#<:search::query:0x8813d98>{:query=> \"is_active:1\"}}>, @filters=[{:range=>{:status=>{:gte=>0}}}], @sort={:created_at=>\"desc\"} ] 现在,如何实现关联来代替急切加载代码。

标签: mysql ruby ruby-on-rails-3 elasticsearch tire


【解决方案1】:

load: true 将为每个返回的结果调用您的数据库。没有它,您的结果就是这些 Item 对象,它们就像您的模型实例一样。

您需要做的是确保为模型设置映射,然后确保导入索引。

class User
    include Mongoid::Document
    field :name, type: String
    mapping do
        indexes :name
    end
 end

然后在您的模型设置好索引后,您将运行 rake tire:import CLASS=User 这将索引您的用户类。在你会做之后

search = Tire.search(User.index_name) do
    query { string 'billy' }
end
puts search.results.first.name

这里有很多好的文档https://github.com/karmi/tire

【讨论】:

    【解决方案2】:
    load: true
    

    将参考数据库进行关联。您可以在映射中添加关联以将其保存在 elasticsearch 中。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 1970-01-01
      • 2013-06-23
      • 2012-01-26
      • 2012-08-09
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多