【问题标题】:why wildcard cannot use `@` in Elasticsearch?为什么通配符不能在 Elasticsearch 中使用 `@`?
【发布时间】:2016-03-29 06:26:11
【问题描述】:

我想使用通配符在 Elasticsearch 中搜索电子邮件。

例如:

{
  "query": {
       "wildcard": {
     "email": "*yahoo*"
    }
  }
}

我可以获得所有包含yahoo 的电子邮件。但是如果我这样搜索,没有文档返回。

{
  "query": {
       "wildcard": {
     "email": "*@yahoo*"
    }
  }
}

我不明白为什么会这样。任何人都可以帮助我吗?

提前致谢!

【问题讨论】:

  • 不应该是.*@yahoo.*,或者如果你只想要数字和字母那么\w*@yahoo\w*
  • @rock321987 抱歉,它不起作用。
  • 它应该工作..不能说任何特定于elastic search..

标签: regex elasticsearch wildcard


【解决方案1】:

Standard Analyzer 是你的罪魁祸首。

您索引中的email 字段似乎是analyzed 字符串。所以当你索引它时,它会分成somemailyahoo.com,这两个令牌将保存在reverse index中。这就是您无法使用@yahoo 进行搜索的原因。 您可以使用analyze api 来查看您的术语是如何被标记化的。

curl -XGET "http://localhost:9200/_analyze?tokenizer=standard" -d "test@yahoo.com"

你会得到以下输出:

{"tokens":[{"token":"test","start_offset":0,"end_offset":4,"type":"<ALPHANUM>","position":0},{"token":"yahoo.com","start_offset":5,"end_offset":13,"type":"<ALPHANUM>","position":1}]}

如果你想用@yahoo搜索,你可以使用uax_url_email

希望这会有所帮助!

【讨论】:

  • +1 此外,通配符适用于未分析的字段。来自文档:匹配具有与通配符表达式匹配的字段的文档(未分析)。
  • @Richa 谢谢你的帮助!
  • @pangpang: 乐于助人:)
  • @Richa 您的答案中的reverse index 到底是什么意思?
  • @AnimeshPandey Inverted index 是 ES 中用于存储令牌的数据结构。在elastic.co/guide/en/elasticsearch/guide/current/…了解更多信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多