2012-11-01 111 views
0

映射:not_analyzed未按预期

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(无破损的令牌)。我有一个用户,电子邮件[email protected]

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

但是,它应该只显示完整的电子邮件指定我猜([email protected])。为什么在这种情况下not_analyze没有考虑?请帮忙。

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

回答

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"] 
      } 
     } 
     } 
    } 
    } 
} 
' 

第二种方法是从_all排除email字段并使用您的查询search against both fields at the same time

+0

非常感谢您的回答。看到这个答案后没有更多的问题要问。我已经通过使用默认设置解决了它。但是,我只是想确定是否有更好的方法来设置分析仪的特定字段,而没有搜索查询中的字段选项。我不想在搜索查询中做出很多更改。这不符合我的要求。 @javanna接受这个答案,因为这给了一个例子更详细的信息。 –

+0

我的建议是使用自定义分析器进行电子邮件。为什么这是一个不好的方法?我觉得这个答案和我的建议几乎一样 –

0

如果没有分析特定字段,那么您应该搜索整个字段内容以匹配它。

有两种选择:

  • 映射未正确提交。你可以通过get mapping api检查你当前的映射:'localhost:9200/_mapping'会给你所有索引的映射。不是轮胎专家,但你不应该提供不被分析为一个字符串? 'not_analyzed'而不是:not_analyzed
  • 如果您看到您的映射存在,那意味着您正在搜索匹配的其他字段。您是否在查询中指定了该字段的名称?
+0

感谢您的回答。将检查出来。很抱歉带有ASAP请求的邮件。 –

+0

要回答第二点中的问题,我没有在查询中指定字段的名称。我正在搜索_all字段。不会__分析工作_all字段搜索。 –

+0

好的,你可能在其他领域有一场比赛,尽管你有地图,但是我会首先检查你的地图是否存在,正如我的建议。 – javanna

1

尝试:分析器代替>“关键字”:指数=>:not_analyzed

它做什么是来标记串,因此这将是搜索仅作为一个整体。 不要忘记重新索引!

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

而且是,如果u通过搜索vamsikrishna,检查是否有相同价值的其他搜索字段(例如,姓名/公司)

+0

感谢您的回答。这可以是一种选择。 –

+0

如果你想索引它,你为什么需要分析该字段?使用'not_analyzed'是最好的选择,除非你想应用一些令牌过滤器,因此你需要分析这个字段并使用关键字分析器。 – javanna

+0

@javanna是的,我明白这一点。这就是我说它可以作为一种选择的原因。我试图使用not_analyzed选项本身。如果这是不可能的,我会尝试这种替代方案。当然会接受,如果这个工作,如果不分析不起作用。 –