【问题标题】:Elasticsearch requires*all* associations to be mapped?Elasticsearch 需要映射*所有*关联?
【发布时间】:2012-09-17 14:06:13
【问题描述】:

我有一个大型模型(它基本上是我的整个应用程序)。我在这个模型上有 7 个或更多关联,包括多对多、:through => 等。这个模型还有一些简单的属性(标题、url 等)。

我唯一关心的索引是那些 3 或 4 个简单的属性(标题、网址、描述、类别)。其他的我不关心。

当我使用load: true 时,一切正常,但一旦我关闭它,一切都会中断。解决这个问题的唯一方法似乎是为每个关联添加复杂的映射、:touch、:touch 回调等等?

我希望我理解错了,因为这将是大量代码,仅用于搜索 3 或 4 个简单属性。

我不知道我在说什么,但我是否可以搜索 elasticsearch 索引,但返回一个 ID 列表,然后以正常的 rails 方式循环遍历它们?

谢谢!

【问题讨论】:

  • 一切都中断是什么意思?为什么 load: true 不可接受?
  • 从我读到的所有地方,它都非常适合调试,但您不想在生产中使用它。只有 950 条记录需要 1000-2000 毫秒才能返回结果
  • 也就是说,如果我搜索一个非常常见的术语(人们会这样做)。对于较小的术语,它需要 100 毫秒左右。
  • load 只是表示搜索结果返回后,从数据库中加载相应的模型对象。性能成本仅取决于搜索结果的数量。如果您实际上一次查看 1000 个搜索结果,那么这将增加相当大的开销。如果您在一个页面上显示结果 20 个项目,那么加载这 20 个对象没什么大不了的。当我需要实际的 Active Record 对象时,我个人会在生产中使用它。
  • 有趣.. 好吧,我每页有 20 个,并且分页。我注意到它会造成近 1 到 2 秒的大幅减速。你能不能看看这个,看看它是否有任何问题,或者可能导致它运行得这么慢? gist.github.com/3785450

标签: ruby-on-rails ruby lucene elasticsearch tire


【解决方案1】:

我不知道轮胎在内部是如何工作的,但据我了解,当load 选项为真时,它会从数据库中加载每条记录。这就是为什么我不认为你想在生产中使用它。如果没有该选项,Tire 将从 elasticsearch 检索信息,因为您应该将要显示的大部分数据存储在 elasticsearch 中。可能您需要向 elasticsearch 添加更多存储的信息。您可以配置要存储在映射中的字段,否则您在 elasticsearch 中始终拥有 source 字段,这正是您索引的 JSON 文档。

最后一个问题的答案是肯定的。您可以从 elasticsearch 中选择要返回的 fields,而不是返回整个 source。在您的情况下,如果我理解正确,您将配置唯一的 id 字段。我不知道如何使用 Tire,但就弹性搜索请求而言,您可以像这样在 url 中执行此操作:

curl localhost:9200/_search?fields=id -d '{
  "query" : {
    "match_all" : {}
  }
}'

或直接在您的查询中像这样:

{
    "fields" : ["id"],
    "query" : {
        "match_all" : {}
    }
}

【讨论】:

  • 谢谢,我需要去阅读,很多:S 你帮了很大的忙
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 2022-01-26
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多