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

标签 elasticsearch

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

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

当我使用 id 而不是电子邮件时,该方法有效!
{
    "query": {
      "terms": {
        "id": [ 43, 67 ]
      }
    }
}

您能否解释一下我的电子邮件查询出了什么问题以及其运作方式

最佳答案

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

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标记器是更好的解决方案。

希望这可以帮助

关于elasticsearch - 弹性条款查询电子邮件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59119569/

相关文章:

scala - 使用Spark检索聚集/存储桶

java - Elasticsearch 失败,错误为 "Failed to execute phase [query_fetch], all shards failed"

Elasticsearch:如何按嵌套对象中的总和值进行过滤?

elasticsearch - Elasticsearch 查询字符串Java api对所有结果给出相同的分数

ruby-on-rails - elasticsearch-rails 空结果

javascript - 如何在 Elasticsearch 中进行精确匹配?

python - elasticsearch python 批量 api (elasticsearch-py)

logging - 在elasticsearch中存储结构化日志

elasticsearch - 为什么我在本地主机上的Elasticsearch群集停留在黄色状态而不是绿色?

python - 如何正确检查滚动结束?