アプリの検索機能を強化するためにElasticSearchを使用しています。検索は完全に機能していますが、並べ替えは複数の単語を含むフィールドには適していません。
ログ'メッセージ'で検索を並べ替えようとすると、次のエラーが発生しました。
「ドキュメントごとに複数の値、またはフィールドごとに複数のトークンを持つ文字列タイプで並べ替えることはできません」
エラーをグーグルで検索したところ、:messageフィールドでマルチフィールドマッピングを使用して(1つは分析され、もう1つは分析されていない)それらを並べ替えることができることがわかりました。だから私はこれをしました:
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
なぜですか?