弹性条款查询电子邮件不起作用

时间:2019-11-30 19:36:39

标签: elasticsearch

我想在Elastic Search Query中传递电子邮件列表,因此我尝试在下面的查询中实现该目的,但是没有得到任何结果。

{
    "query": {
      "terms": {
        "email": [ "andrew@gmail.com", "michel@gmail.com" ]
      }
    }
}

当我使用 id 而不是电子邮件时,它起作用了!

{
    "query": {
      "terms": {
        "id": [ 43, 67 ]
      }
    }
}

请您解释一下我的电子邮件查询出了什么问题以及如何使它起作用

1 个答案:

答案 0 :(得分:0)

如果要将电子邮件地址识别为单个令牌,则应使用uax_url_email令牌生成器。

UAX URL Email Tokenizer

一个工作示例:

映射

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type": "custom",
          "tokenizer": "my_tokenizer",
          "filter": ["lowercase", "stop"]
        }
      },
      "tokenizer": {
        "my_tokenizer":{
          "type": "uax_url_email"
        }
      }
    }
  },
  "mappings": {
      "properties": {
        "email": {
          "type": "text",
          "analyzer": "my_email_analyzer",
          "search_analyzer": "my_email_analyzer",
          "fields": {
            "keyword":{
              "type":"keyword"
            }
          }
        }

    }
  }
}

发布一些文档

POST my_index/_doc/1
{
  "email":"andrew@gmail.com"
}

POST my_index/_doc/2
{
  "email":"michel@gmail.com"
}

搜索查询

GET my_index/_search
{
  "query": {
    "multi_match": {
      "query": "andrew@gmail.com michel@gmail.com",
      "fields": ["email"]
    }
  }
}

结果

"hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.6931472,
        "_source" : {
          "email" : "andrew@gmail.com"
        }
      },
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.6931472,
        "_source" : {
          "email" : "michel@gmail.com"
        }
      }
    ]
  }

另一种选择是使用keyword类型。

搜索查询

GET my_index/_search
{
  "query": {
    "terms": {
      "email.keyword": [
        "andrew@gmail.com",
        "michel@gmail.com"
      ]
    }
  }
}

我认为使用uax_url_email标记程序是更好的解决方案。

希望这会有所帮助