ElasticSearch 不使用所有字段(字符串数组)进行搜索
ElasticSearch not using all fields (array of strings) for search
我刚刚开始使用 ES rails,我遇到了一些我不明白的事情:
我有一个 Artist 模型(为示例进行了简化):
class Artist < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
# simplified to get the idea
def get_aliases
["alias1", "alias2"]
end
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, :get_aliases],
include: {
get_tracks: { only: :name } },
})
end
end
我的问题是 ES 搜索没有使用 get_aliases 属性 来给出结果:只搜索 'name' 属性:
我有一个开发者。有几个艺术家的数据库,其中 none 个在其中有字符串 "Phil",但一个在其别名中有 "Phillip"。
当我尝试 Artist.__elasticsearch__.search('phil').count
时,我得到 0 个结果。
我已经尝试 Artist.all.__elasticsearch__.import
获得:
=> 0
和Artist.__elasticsearch__.refresh_index!
得到:
=> {"_shards"=>{"total"=>10, "successful"=>5, "failed"=>0}}
(不确定这两个命令之间有什么区别...),但运气不好:/
我的问题是因为我使用字符串数组作为 属性 吗?我应该以不同的方式索引它吗?
欢迎任何idea/help!
编辑:
我正在使用
gem 'elasticsearch-rails', '~> 0.1.7'
gem 'elasticsearch-model', '~> 0.1.7'
并且安装的 ElasticSearch 服务器是 1.7.1
感谢 Omarvelous 评论,我让它工作了,区别在于 as_indexed_json 方法:
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, :get_aliases],
include: {
get_tracks: { only: :name } },
})
end
应该是(注意 get_aliases 不是 'only' 数组中的符号):
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, get_aliases],
include: {
get_tracks: { only: :name } },
})
end
两种实现(符号或实际方法)都会在控制台中为您提供相同的结果:
irb(main):016:0> Artist.find(7).as_indexed_json
=> {"name"=>"Mick Jagger", "get_aliases"=>["Michael Philip Jagger"], "get_tracks"=>[]}
但在 ES 中,情况就完全不同了!
谁有好的link学习如何通过Rails请求ES,不胜感激;)
再次感谢 Omarvelous ;)
我刚刚开始使用 ES rails,我遇到了一些我不明白的事情:
我有一个 Artist 模型(为示例进行了简化):
class Artist < ActiveRecord::Base
include Elasticsearch::Model
include Elasticsearch::Model::Callbacks
# simplified to get the idea
def get_aliases
["alias1", "alias2"]
end
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, :get_aliases],
include: {
get_tracks: { only: :name } },
})
end
end
我的问题是 ES 搜索没有使用 get_aliases 属性 来给出结果:只搜索 'name' 属性:
我有一个开发者。有几个艺术家的数据库,其中 none 个在其中有字符串 "Phil",但一个在其别名中有 "Phillip"。
当我尝试 Artist.__elasticsearch__.search('phil').count
时,我得到 0 个结果。
我已经尝试 Artist.all.__elasticsearch__.import
获得:
=> 0
和Artist.__elasticsearch__.refresh_index!
得到:
=> {"_shards"=>{"total"=>10, "successful"=>5, "failed"=>0}}
(不确定这两个命令之间有什么区别...),但运气不好:/
我的问题是因为我使用字符串数组作为 属性 吗?我应该以不同的方式索引它吗?
欢迎任何idea/help!
编辑:
我正在使用
gem 'elasticsearch-rails', '~> 0.1.7'
gem 'elasticsearch-model', '~> 0.1.7'
并且安装的 ElasticSearch 服务器是 1.7.1
感谢 Omarvelous 评论,我让它工作了,区别在于 as_indexed_json 方法:
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, :get_aliases],
include: {
get_tracks: { only: :name } },
})
end
应该是(注意 get_aliases 不是 'only' 数组中的符号):
def as_indexed_json(options = {})
self.as_json({
methods: [ :get_aliases, :get_tracks ],
only: [ :name, get_aliases],
include: {
get_tracks: { only: :name } },
})
end
两种实现(符号或实际方法)都会在控制台中为您提供相同的结果:
irb(main):016:0> Artist.find(7).as_indexed_json
=> {"name"=>"Mick Jagger", "get_aliases"=>["Michael Philip Jagger"], "get_tracks"=>[]}
但在 ES 中,情况就完全不同了!
谁有好的link学习如何通过Rails请求ES,不胜感激;)
再次感谢 Omarvelous ;)