首页 > 解决方案 > 为什么@与elasticsearch中的query_string查询不匹配?

问题描述

我有一个带有电子邮件 ID 的字段,当我尝试匹配整个电子邮件 ID 时,它与文档不匹配,但当我不包含 @ 文档匹配时。我尝试将 @ 替换为 . 和*,它们都没有帮助匹配。

如何匹配整个电子邮件?

例如文档:

{
  ...
  "email": "sample@gmail.com"
}

例如失败查询:

{
  "query": {
    "query_string": {
      "default_field": "email",
      "query": "*mple@gmail.c*"
    }
  }
}

例如成功查询:

{
  "query": {
    "query_string": {
      "default_field": "email",
      "query": "*ample*"
    }
  }
}

标签: elasticsearch

解决方案


正如 Richie 在另一篇文章中已经提到的,这里它与您的搜索查询不匹配,因为 Elastic 中的默认分析器是standard分析器,它在标记化过程中从文本中删除特殊字符。

您需要执行以下操作才能使其正常工作。

  1. 定义使用UAX URL 标记器的自定义分析器

  2. @在您希望可搜索的字段上使用您的自定义分析器。在您的 ES 模式中定义它。

  3. 检查将your_index_namehttp://localhost:9200/{your_index_name}/_mapping替换为您的索引名称的 O/P并验证现在使用的字段,自定义分析器。
  4. 重新索引整个数据,因为更改字段的分析器是一项重大更改,并且只有在您重新索引整个数据之后,使用新的映射才会有预期的标记。
  5. 使用_analyze api检查为您的字段生成的令牌。现在它应该有包含@.

如果您在实施此操作时遇到任何问题,请告诉我。


推荐阅读