弹性搜索将我的查询字符串标记为电子邮件地址。怎么阻止它?

时间:2015-10-19 21:57:22

标签: elasticsearch

我的类型是用户:电子邮件和用户名。

电子邮件字段设置为字符串类型,带有自定义分析器' exact_lower':

index.analysis.analyzer.exact_lower:
  type: custom
  tokenizer: keyword
  filter : lowercase

问题是,当我搜索完整的电子邮件地址时,它会返回匹配,就好像' @'是一个空间。我认为由于它使搜索标记化。

查询我发送信息:

{
  "query" : {
    "query_string" : {
      "query" : "admin@example.com"
    }
  }
}

它返回任何匹配' admin'或者' example.com'。例如。 admin @ example.com,admin @ abc.com和john@example.com。我希望它只返回admin@example.com ...

我想我需要告诉搜索不要对query_string进行标记,但是我们无法弄清楚如何做到这一点。

非常感谢任何帮助!谢谢, 塞特

1 个答案:

答案 0 :(得分:4)

就是这样,因为query_string正在使用_all字段作为搜索的默认字段。那个领域有自己的分析仪。

email字段定义分析器不会将同一分析器应用于_all字段。有关_all的更多详细信息,您可以找到here

为了准确匹配电子邮件地址,我建议使用不同的查询:

{
  "query": {
    "term": {
      "email": {
        "value": "admin@example.com"
      }
    }
  }
}

或使用query_string,但引用特定字段:

{
  "query": {
    "query_string": {
      "query": "email:admin@example.com"
    }
  }
}