为什么@不与Elasticsearch中的query_string查询匹配?

时间:2019-03-14 17:45:53

标签: elasticsearch

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

如何匹配整个电子邮件?

例如文档:

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

例如失败查询:

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

例如成功查询:

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

2 个答案:

答案 0 :(得分:2)

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

您需要做以下事情才能使其正常工作。

  1. 定义使用UAX URL tokenizer

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

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

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

答案 1 :(得分:0)

是的,因此从https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-uaxurlemail-tokenizer.html中您可以看到标准分析仪可以制造

POST _analyze
{
  "text": "Email me at john.smith@global-international.com"
}

[ Email, me, at, john.smith, global, international.com ]

uax_url_email分析器所做的

 [ Email, me, at, john.smith@global-international.com ]