0

我在 Rails 中将轮胎宝石用于 ElasticSearch。

好的,所以我整天都在与这个作斗争,这就是我已经走了多远。我想让我的模型上的字段不可搜索,但它们仍然应该在 _source 中可用,以便我可以使用它们对搜索结果进行排序。

我的映射:

mapping do
indexes :created_at, :type => 'date', :index => :not_analyzed
indexes :vote_score, :type => 'integer', :index => :not_analyzed
indexes :title
indexes :description
indexes :tags
indexes :answers do
indexes :description
end
end

我的 to_indexed_json 方法:

def to_indexed_json
{
vote_score: vote_score,
created_at: created_at,
title: title,
description: description,
tags: tags,
answers: answers.map{|answer| answer.description}
}.to_json
end

我的搜索查询:

def self.search(term='', order_by, page: 1)
tire.search(page: page, per_page: PAGE_SIZE, load: true) do
query { term.present? ? string(term) : all }
sort {
by case order_by
when LAST_POSTED then {created_at: 'desc'}
else {vote_score: 'desc', created_at: 'desc'}
end
}
end
end

我现在要解决的唯一问题是如何使vote_scorecreated_at字段不可搜索,但在搜索时仍然设法使用它们进行排序。

我试过indexes :created_at, :type => 'date', :index => :no了,但没有奏效。

4

2 回答 2

1

如果我理解您,当您将搜索查询发送到 elasticsearch 时,您没有指定字段。这意味着它将在该_all字段中执行。这是一个“特殊”字段,可以让 elasticsearch 更容易快速使用。默认情况下,所有字段都被索引两次,一次在自己的字段中,一次在_all字段中。(您甚至可以将不同的映射/分析器应用于这两个索引。)

我认为将字段的映射设置为"include_in_all": "false"应该适合您(删除"index": "no"部分)。现在该字段将在其字段名下被标记化(并且您可以使用它进行搜索),但是当在该_all字段上进行搜索时,它不会影响结果(因为它的任何标记都没有存储在该_all字段中)。

阅读有关映射的 es 文档,向下滚动到每种类型的参数

祝你好运!

于 2013-07-27T20:45:48.383 回答
0

我最终采用了只匹配我想要并且有效的字段的方法。这匹配多个字段。

tire.search(page: page, per_page: PAGE_SIZE, load: true) do
      query { term.present? ? (match [:title, :description, :tags, :answers], term) : all }
      sort {
        by case order_by
             when LAST_POSTED then {created_at: 'desc'}
             else {vote_score: 'desc', created_at: 'desc'}
           end
      }
    end
于 2013-07-28T17:49:43.413 回答