映射rails belongs_to与elacticsearch的关系,以便通过嵌套对象和分页进行搜索

时间:2013-06-25 07:15:01

标签: elasticsearch tire

在我的rails项目中,我有两个模型:

class Student < ActiveRecord::Base
  attr_accessible :name
  has_many :homeworks   
  ...
end

class Homework < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  attr_accessible :grade
  belongs_to :student
  ...
end

我想在弹性搜索方面运行查询:

  1. 查找所有至少有一个'F'成绩的学生完成家庭作业。
  2. 排序学生
    • 按家庭作业评定'F'
    • 按名称
  3. Paginate学生
  4. 这个简化的例子可以在不使用elasticsearch的情况下解决,但我正在开发的项目具有全文搜索功能,需要弹性搜索。

    我尝试了以下方法:

    1. 在父对象内存储父对象的属性,并使用构面进行分组。这似乎有效,但我无法对结果进行分页,如下所述:http://bit.ly/10hyYoS
    2. 使用嵌套文档。我的搜索查询返回过滤后的学生所有未经过滤的作业,我不知道如何在搜索结果中过滤孩子。
    3. 我很感激有关如何将这些模型映射到elasticsearch并有效执行查询的建议。

      不要求完整的解决方案,只是一般的方向感。我应该使用嵌套对象吗?将学生的属性存储在作业中并使用构面进行分组?

      提前致谢!

1 个答案:

答案 0 :(得分:0)

在类似的用例中,我使用了_parent映射,以便homework具有以下的映射属性:

"_parent": "student"

然后我做一个常规查询:

"query":{ 
  "filtered":{
    "filter": {
     "and": [{
       "term": {"_type": "student"},    
       "has_child": {
          "query":{
             "filtered":{
               "filter":{
                 "term":{"grade", "value"}
              ...

(除非在另一个项目的类似查询中,否则不进行测试)

has_child的过滤查询是重要的部分,因为它允许您搜索具有F级作业的学生并将其包含在您的方面。

然后,您需要扩展filter子句以包含其余的查询术语和分页。筛选后的查询会限制构面使用的文档,因此您可以选择通过created_at字段或其他内容进行额外过滤,从而限制您正在使用的结果。