【问题标题】:Elasticsearch query not returning results when querying by email通过电子邮件查询时,Elasticsearch 查询不返回结果
【发布时间】:2021-01-22 14:30:47
【问题描述】:

在 elasticsearch 索引中,我有一个名为 reporter 的字段,运行此查询时没有得到任何结果:

GET /index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "reporter": "Andr" } }
      ]
    }
  }
}

但是,如果我将值更改为“Andre”的全名,我会得到很多结果。如何返回 reporter 字段包含“A”、“An”、“And”、“Andr”等的记录?只有当值与电子邮件中句点之间的完整字符串匹配时,我才会得到结果。

以下是分析设置:

{
   "analysis": {
      "filter": {
         "email": {
            "type": "pattern_capture",
            "preserve_original": true,
            "patterns": [
               "([^@]+)",
               "(\\p{L}+)",
               "(\\d+)",
               "@(.+)",
               "([^-@]+)"
            ]
         }
      },
      "analyzer": {
         "email": {
            "tokenizer": "uax_url_email",
            "filter": [
               "email",
               "lowercase",
               "unique"
            ]
         }
      }
   }
}

这是reporter 映射:

"reporter": {
    "type": "text",
    "analyzer": "email"
}

【问题讨论】:

    标签: elasticsearch kibana


    【解决方案1】:

    Edge N-gram 过滤器可以帮助解决您的用例。它基本上从令牌的开头输出 n-gram。 n 克可以通过设置 min_gram 和 max_gram 字段来控制。我们可以使用下面的过滤器设置来根据上述示例的要求进行输出。

    "filter": [
        { "type": "edge_ngram",
          "min_gram": 1
        }
      ] 
    

    更多细节可以在这个链接中找到

    https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenfilter.html

    【讨论】:

    • 所以我会使用那个过滤器而不是电子邮件过滤器?还是除此之外?
    • 取决于您的用例。但它应该适用于两种情况
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多