I'm using elastic search to enhance search capabilities in my app. Search is working perfectly, however sorting is not for fields with multiple words.
我正在使用弹性搜索来增强我的应用中的搜索功能。搜索工作正常,但排序不适用于包含多个单词的字段。
When I try to sort the search by log 'message', I was getting the error:
当我尝试按日志'消息'对搜索进行排序时,我收到错误:
"Can't sort on string types with more than one value per doc, or more than one token per field"
“无法对每个文档具有多个值的字符串类型进行排序,或者每个字段使用多个标记”
I googled the error and find out that I can use multi-fields mapping on the :message field (one analyzed and the other one not) to sort them. So I did this:
我用Google搜索了错误,发现我可以在: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
But, for some reason is not passing this mapping to ES.
但是,由于某种原因,没有将此映射传递给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"}}
So, Log.index.mapping
is the current mapping in ES which doesn't contain the multi-field that I created. Am I missing something? and why the multi-field is shown in Log.mapping
but not in Log.index.mapping
?
因此,Log.index.mapping是ES中的当前映射,它不包含我创建的多字段。我错过了什么吗?为什么多字段在Log.mapping中显示但在Log.index.mapping中没有?
1 个解决方案
#1
5
I have changed the workflow from:
我已经改变了工作流程:
Log.index.delete; Log.index.create; Log.import
to
至
Log.index.delete; Log.create_elasticsearch_index; Log.import
The MyModel.create_elasticsearch_index
creates the index with proper mapping from model definition. See Tire's issue #613.
MyModel.create_elasticsearch_index使用模型定义中的正确映射创建索引。见轮胎问题#613。
#1
5
I have changed the workflow from:
我已经改变了工作流程:
Log.index.delete; Log.index.create; Log.import
to
至
Log.index.delete; Log.create_elasticsearch_index; Log.import
The MyModel.create_elasticsearch_index
creates the index with proper mapping from model definition. See Tire's issue #613.
MyModel.create_elasticsearch_index使用模型定义中的正确映射创建索引。见轮胎问题#613。