1

映射:

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

从上面的映射可以看出,email 字段设置为 not_analyzed(没有损坏的令牌)。我有一个电子邮件用户 vamsikrishna@gmail.com。

现在,当我搜索 vamsikrishna 时,结果显示用户......我猜它正在使用默认分析器。为什么?

但是,我猜只有在指定完整的电子邮件时才会显示它(vamsikrishna@gmail.com)。为什么在这种情况下不考虑 :not_analyzed ?请帮忙。

我只需要将电子邮件字段设置为 not_analyzed,其他字段应使用标准分析器(默认情况下已完成)。

4

3 回答 3

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并使用您的查询同时搜索这两个字段

于 2012-11-01T14:23:39.143 回答
1

尝试 :analyzer => 'keyword' 而不是 :index => :not_analyzed

它所做的是对字符串进行标记,因此它只能作为一个整体进行搜索。不要忘记重新索引!

参考 - http://www.elasticsearch.org/guide/reference/index-modules/analysis/keyword-analyzer.html

而且,如果您通过搜索 vamsikrishna 获得结果,请检查您是否有其他具有相同值的可搜索字段(例如,姓名/公司)

于 2012-11-01T08:58:31.160 回答
0

没错,如果未分析特定字段,您应该搜索整个字段内容以便在其上进行匹配。

有两种选择:

  • 映射未正确提交。您可以通过get mapping api检查您当前的映射:“localhost:9200/_mapping”将为您提供所有索引的映射。不是轮胎专家,但您不应该提供 not_analyzed 作为字符串吗?'not_analyzed'而不是:not_analyzed
  • 如果您看到您的映射在那里,这意味着您正在搜索匹配的其他一些字段。您是否在查询中指定字段的名称?
于 2012-11-01T08:49:03.373 回答