0

在我的 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. 给学生分页

这个简化的例子可以在不使用elasticsearch的情况下解决,但是我正在处理的项目有一个需要elasticsearch的全文搜索功能。

我尝试了以下方法:

  1. 将父对象的属性存储在子对象中,并使用构面进行分组。这似乎可行,但我无法按此处所述对结果进行分页:http: //bit.ly/10hyYoS
  2. 使用嵌套文档。我的搜索查询返回过滤后的学生以及所有未过滤的作业,我不确定如何在搜索结果中过滤儿童。

我将不胜感激有关如何将这些模型映射到弹性搜索并有效执行查询的建议。

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

提前致谢!

4

1 回答 1

0

在一个类似的用例中,我使用了 _parent 映射,因此作业具有以下映射属性:

"_parent": "student"

然后我做一个常规查询:

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

(这未经测试,除非在另一个项目的类似查询中)

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

然后,您需要扩展过滤器子句以包含其余的查询词和分页。过滤后的查询限制了 facet 使用的文档,因此您可以选择通过 created_at 字段或其他内容进行额外过滤,从而限制您使用的结果。

于 2013-06-25T23:25:23.583 回答