映射:
include Tire::Model::Search
mapping do
indexes :name, :boost => 10
indexes :account_id
indexes :company_name
indexes :email, :index => :not_analyzed
end
def to_indexed_json
to_json( :only => [:name, :account_id, :email, :company_name],
)
end
从上面的映射可以看出,电子邮件字段设置为not_analyzed(没有破坏的令牌)。我的用户使用电子邮件vamsikrishna@gmail.com。
现在当我搜索vamsikrishna时,结果显示用户......我猜它正在使用默认分析器。为什么呢?
但是,只有在指定了完整的电子邮件时才应该显示(vamsikrishna@gmail.com)。为什么:在这种情况下不考虑not_analyzed?请帮忙。
我只需将电子邮件字段设置为not_analyzed,其他字段应使用标准分析器(默认情况下已完成)。
答案 0 :(得分:2)
您正在使用_all
字段进行搜索。这意味着您使用的是为_all
指定的分析器,而不是email
。因此,为email
指定的分析器不会影响您的搜索。
有几种方法可以解决这个问题。首先,您可以修改_all
字段的分析器,以区别对待电子邮件。例如,您可以切换到uax_url_email
令牌集,该令牌集可用作standard
令牌集,但不会将电子邮件拆分为令牌。
curl -XPUT 'http://localhost:9200/test-idx' -d '{
"settings" : {
"index": {
"analysis" :{
"analyzer": {
"default": {
"type" : "custom",
"tokenizer" : "uax_url_email",
"filter" : ["standard", "lowercase", "stop"]
}
}
}
}
}
}
'
第二种方法是从email
中排除_all
字段,并将您的查询用于search against both fields at the same time。
答案 1 :(得分:1)
尝试:analyzer => 'keyword'代替:index => :not_analyzed
它的作用是对字符串进行标记,因此它只能作为一个整体进行搜索。 别忘了重新索引!
参考 - http://www.elasticsearch.org/guide/reference/index-modules/analysis/keyword-analyzer.html
然而,如果您通过搜索vamsikrishna获得结果,请检查您是否有其他具有相同值的可搜索字段(例如,名称/公司)
答案 2 :(得分:0)
你是对的,你应该搜索整个字段内容,以便在没有分析特定字段时匹配它。
有两种选择:
'not_analyzed'
代替:not_analyzed
?