新手问题 [已解决] 请教:如何让 elasticsearch 查询出来的数据,已经有序?

lihuazhang · 2016年02月19日 · 最后由 chenhengjie123-github 回复于 2016年12月05日 · 4962 次阅读

仿照 RubyChina,SearchController 如下:

class SearchController < ApplicationController
  def index
    search_params = {
        sort: [
            {updated_at: {order: "desc", ignore_unmapped: true}}
        ],
        query: {
            multi_match: {
                query: params[:q],
                fields: ['title', 'body', 'name', 'login'],
                fuzziness: 2,
                prefix_length: 5,
                operator: :and
            }
        },
        highlight: {
            pre_tags: ["[h]"],
            post_tags: ["[/h]"],
            fields: {title: {}, body: {}, name: {}, login: {}}
        }
    }
    @result = Elasticsearch::Model.search(search_params, [User, Page, Topic]).paginate(page: params[:page], per_page: 30)
  end
end

我想实现:出来的结果是保持 User, Page, Topic 的顺序,如何 Topic 里面按照 updated_at 排序。试了好多方法,不得其法,特来求解。

目前只能让 user 排在最前面,Page 和 Topic 就混乱了。

给 User, Page, Topic 的 Index 都加上一个参数,比如 type_order, 依次设置为: 10, 5, 1 然后在 search_params 的 sort 里增加 type_order, 并且放在 update_at 前面

#2 楼 @jun1st 多谢,成功了。具体方法如下:

在 Topic User Page 分别加入:type_order: self.type_order

def as_indexed_json(options={})
  {
      title: self.title,
      body: self.full_body,
      node_name: self.node_name,
      updated_at: self.updated_at,
      excellent: self.excellent,
      type_order: self.type_order
  }
end

def type_order
  1 for topic
  5 for Page
  10 for User
end

然后在 Search Controller 里面:

class SearchController < ApplicationController
  def index
    search_params = {
        sort: [
            {type_order: {order: "desc", ignore_unmapped: true}},
            {updated_at: {order: "desc", ignore_unmapped: true}},
            {excellent: {order: "desc", ignore_unmapped: true}}
        ],
        query: {
            multi_match: {
                query: params[:q],
                fields: ['title', 'body', 'name', 'login'],
                fuzziness: 2,
                prefix_length: 5,
                operator: :and
            }
        },
        highlight: {
            pre_tags: ["[h]"],
            post_tags: ["[/h]"],
            fields: {title: {}, body: {}, name: {}, login: {}}
        }
    }
    @result = Elasticsearch::Model.search(search_params, [User, Page, Topic]).paginate(page: params[:page], per_page: 30)
  end
end

这下对了

lihuazhang 重新开启了讨论。 12月05日 20:39
需要 登录 后方可回复, 如果你还没有账号请 注册新账号