gpt4 book ai didi

ruby-on-rails - 为什么多字段映射不适用于 Elasticsearch 的轮胎 gem ?

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:57 24 4
gpt4 key购买 nike

我正在使用 Elasticsearch 来增强我的应用程序中的搜索功能。搜索工作正常,但排序不适用于包含多个单词的字段。

当我尝试按日志“消息”对搜索进行排序时,出现错误:

“无法对每个文档有多个值或每个字段有多个标记的字符串类型进行排序”

我用谷歌搜索了这个错误,发现我可以在 :message 字段上使用多字段映射(一个分析,另一个不分析)来对它们进行排序。所以我这样做了:

class Log < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks

tire.mapping do
indexes :id, index: :not_analyzed
indexes :source, type: 'string'
indexes :level, type: 'string'
indexes :created_at, :type => 'date', :include_in_all => false
indexes :updated_at, :type => 'date', :include_in_all => false
indexes :message, type: 'multi_field', fields: {
analyzed: {type: 'string', index: 'analyzed'},
message: {type: 'string', index: :not_analyzed}
}
indexes :domain, type: 'keyword'
end
end

但是,出于某种原因没有将此映射传递给 ES。

rails console
Log.index.delete #=> true
Log.index.create #=> 200 : {"ok":true,"acknowledged":true}
Log.index.import Log.all #=> 200 : {"took":243,"items":[{"index":{"_index":"logs","_type":"log","_id":"5 ... ...

# Index mapping for :message is not the multi-field
# as I created in the Log model... why?

Log.index.mapping
=> {"log"=>
{"properties"=>
{"created_at"=>{"type"=>"date", "format"=>"dateOptionalTime"},
"id"=>{"type"=>"long"},
"level"=>{"type"=>"string"},
"message"=>{"type"=>"string"},
"source"=>{"type"=>"string"},
"updated_at"=>{"type"=>"date", "format"=>"dateOptionalTime"}}}}

# However if I do a Log.mapping I can see the multi-field
# how I can fix that and pass the mapping correctly to ES?

Log.mapping
=> {:id=>{:index=>:not_analyzed, :type=>"string"},
:source=>{:type=>"string"},
:level=>{:type=>"string"},
:created_at=>{:type=>"date", :include_in_all=>false},
:updated_at=>{:type=>"date", :include_in_all=>false},
:message=>
{:type=>"multi_field",
:fields=>
{:message=>{:type=>"string", :index=>"analyzed"},
:untouched=>{:type=>"string", :index=>:not_analyzed}}},
:domain=>{:type=>"keyword"}}

因此,Log.index.mapping 是 ES 中的当前映射,不包含我创建的多字段。我错过了什么吗?为什么多字段显示在 Log.mapping 而不是 Log.index.mapping

最佳答案

我改变了工作流程:

Log.index.delete; Log.index.create; Log.import

Log.index.delete; Log.create_elasticsearch_index; Log.import

MyModel.create_elasticsearch_index 使用模型定义的适当映射创建索引。参见轮胎问题 #613 .

关于ruby-on-rails - 为什么多字段映射不适用于 Elasticsearch 的轮胎 gem ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com