not_analyzed没有按预期工作

时间:2012-11-01 08:05:36

标签: ruby-on-rails elasticsearch tire

映射:

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,其他字段应使用标准分析器(默认情况下已完成)。

3 个答案:

答案 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)

你是对的,你应该搜索整个字段内容,以便在没有分析特定字段时匹配它。

有两种选择:

  • 尚未正确提交映射。您可以通过get mapping api检查当前的映射:'localhost:9200 / _mapping'将为您提供所有索引的映射。不是轮胎专家,但你不应该提供not_analyzed作为一个字符串? 'not_analyzed'代替:not_analyzed
  • 如果您看到您的映射存在,则表示您正在搜索其他匹配的字段。您是在指定查询中的字段名称吗?