【问题标题】:Map rails belongs_to relation to elacticsearch for search by nested object and pagination将 rails belongs_to 映射到 elasticsearch 以通过嵌套对象和分页进行搜索
【发布时间】:2013-06-26 07:25:23
【问题描述】:

在我的 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. 使用嵌套文档。我的搜索查询返回已过滤的学生以及所有未过滤的作业,我不确定如何在搜索结果中过滤儿童。

我希望得到有关如何将这些模型映射到 elasticsearch 并有效执行查询的建议。

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

提前致谢!

【问题讨论】:

    标签: elasticsearch tire


    【解决方案1】:

    在一个类似的用例中,我使用了 _parent 映射,因此 homework 有一个映射属性:

    "_parent": "student"
    

    然后我做一个常规查询:

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

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

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

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

    【讨论】:

    • 菲尔,谢谢你的回答。我想出了如何按计数排序,唯一缺少的是分页。任何有关这方面的指导都会非常有帮助!
    • 彼得,我猜分页问题并不像使用此处描述的 from/size 那样简单:elasticsearch.org/guide/reference/api/search/from-size ...虽然我没有尝试过,但我的假设是它没有t 有助于减少刻面。如果没有,我可能会考虑按名称的首字母或其他有助于根据您的应用直观地限制结果集的形式进行分页。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2022-01-16
    • 2013-07-21
    • 2015-07-30
    相关资源
    最近更新 更多