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

set*_*uss 2 elasticsearch

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

电子邮件字段设置为字符串类型,使用自定义分析器“exact_lower”:

index.analysis.analyzer.exact_lower:
  type: custom
  tokenizer: keyword
  filter : lowercase
Run Code Online (Sandbox Code Playgroud)

问题是,当我搜索完整的电子邮件地址时,它返回匹配项,就好像“@”是空格一样。我认为这是因为它标记了搜索。

我发送的查询:

{
  "query" : {
    "query_string" : {
      "query" : "admin@example.com"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它返回任何与“admin”或“example.com”匹配的内容。例如 admin@example.com、admin@abc.com 和 john@example.com。我希望它只返回 admin@example.com...

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

任何帮助深表感谢!谢谢,赛斯

And*_*fan 5

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

为您的领域定义分析器email并不是将相同的分析器应用于该_all领域。有关您的更多详细信息,_all请参阅此处

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

{
  "query": {
    "term": {
      "email": {
        "value": "admin@example.com"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或使用query_string,但指的是特定字段:

{
  "query": {
    "query_string": {
      "query": "email:admin@example.com"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)