ElasticSearch + Tire仅在id字段上搜索

时间:2013-10-18 03:14:36

标签: ruby-on-rails mongoid elasticsearch tire

我到处都看,但没有什么可以帮助我。我无法弄清楚问题是什么。

我的模特

class Article
 include Mongoid::Document
 include Mongoid::Timestamps


 include Tire::Model::Search
 include Tire::Model::Callbacks
  mapping do
    indexes :_id, :index => :not_analyzed
    indexes :title
    indexes :body
  end


 def to_indexed_json
   self.to_json
 end

http://localhost:9200/articles/_mapping
{
  "articles": {
    "article": {
      "properties": {
        "$oid": {
          "type": "string"
        },
        "body": {
          "type": "string"
        },
        "title": {
          "type": "string"
        }
      }
    }
  }
}

Article.search 'love'没有给出任何结果,但有文章标题为“爱”,我试图建立许多请求,但没有任何作用。

所有时间都是相同的结果:

"hits"=>{"total"=>0, "max_score"=>nil, "hits"=>[]}}

但如果我输入:Article.search "cbc267c955464f22d72a0100",它会给我一篇标题为“爱”的文章

所以在我看来轮胎只在ID字段上创建索引,无论模型上的映射索引如何。

当我重新创建索引时

Article.index_name
  => "articles" 
Tire.index('articles').delete
  => true 
Article.import

我的映射变为:

{
  "articles": {
    "article": {
      "properties": {
        "$oid": {
          "type": "string"
        }
      }
    }
  }
}

已更新

module BSON
  class ObjectId
    def as_json(*args)
      to_s()
    end

    def to_json(*args)
      MultiJson.encode(as_json())
    end
  end
end

实现此初始化后,一切似乎都正常

1 个答案:

答案 0 :(得分:1)

使用tire时我也遇到过这样的问题。删除索引后,您可以尝试Article.create_elasticsearch_indexArticle.tire.index.import Article.all

索引文档中的_source字段应包含titleidbody,以便进行搜索。

无论如何,tire已经退役,elasticsearch gem现已发布。