首页 文章

如何设置ElasticSearch为电子邮件地址执行SQL LIKE“%”?

提问于
浏览
2

在SQL中,我可以使用SQL LIKE很好地搜索电子邮件地址 .

使用电子邮件“stack@domain.com”,搜索“堆栈”,“@ domain.com”,“domain.com”或“域名”将使我返回所需的电子邮件地址 .

如何使用ElasticSearch获得相同的结果?

我玩nGram,edgeNGram,uax_url_email等,搜索结果非常糟糕 . 如果我错了请纠正我,听起来我必须做以下事情:

__9__用于index_analyzer

  • 使用"keyword","whitespace"或"uax_url_email" tokenizer,因此电子邮件不会被标记化

  • 但通配符查询似乎不起作用(至少有轮胎)

  • 使用"nGram"或"edgeNGram"进行过滤

  • 我总是得到太多不需要的结果,例如在搜索"first-second"时获取"first@domain.com" .

  • for search_analyzer

  • 不要做nGram

一个实验代码

tire.settings :number_of_shards => 1,
            :number_of_replicas => 1,
            :analysis => {
                :filter => {
                    :db_ngram  => {
                        "type"     => "nGram",
                        "max_gram" => 255,
                        "min_gram" => 3 }
                },
                :analyzer => {
                    :string_analyzer => {
                        "tokenizer"    => "standard",
                        "filter"       => ["standard", "lowercase", "asciifolding", "db_ngram"],
                        "type"         => "custom" },
                    :index_name_analyzer => {
                        "tokenizer"    => "standard",
                        "filter"       => ["standard", "lowercase", "asciifolding"],
                        "type"         => "custom" },
                    :search_name_analyzer => {
                        "tokenizer"    => "whitespace",
                        "filter"       => ["lowercase", "db_ngram"],
                        "type"         => "custom" },
                    :index_email_analyzer => {
                        "tokenizer"    => "whitespace",
                        "filter"       => ["lowercase"],
                        "type"         => "custom" }
                }
            } do
    mapping do
      indexes :id,           :index    => :not_analyzed
      indexes :name,         :index_analyzer => 'index_name_analyzer', :search_analyzer => 'search_name_analyzer'
      indexes :email,        :index_analyzer => 'index_email_analyzer', :search_analyzer => 'search_email_analyzer'
    end
end

特殊情况不能很好地运作:

带连字符的

  • 封电子邮件(例如email-hyphen@domain.com)

  • 查询字符串'@'在开头或结尾

  • 完全匹配

  • 使用像'@'这样的通配符搜索会得到非常意外的结果 .

假设我有"aaa@email.com","aaa_0@email.com"和"aaa-0@email.com, searching " aaa " gives me " aaa@a.com " " aaa-0@email.com . 搜索"aaa*"给我一切,但"aaa-*"什么也没给我 . 那么,我应该怎么做 exact match wildcard 查询?对于这些类型的查询,我得到了几乎相同的结果,用于不同的标记器/分析器 .

我在每次映射更改后执行以下操作:Model.tire.index.delete Model.tire.create_elasticsearch_index Model.tire.index.import Model.all

参考文献:

1 回答

  • 0

    考虑到你想要完成的事情, KeywordAnalyzer 可能是分析仪的合理选择,尽管我没有看到任何会导致 WhitespaceAnalyzer 问题的事情 .

    我怀疑你遇到了查询解析和分析的问题,尽管你还没有真正描述过如何查询 . 最简单的情况是简单地使用termprefix查询 .

    它似乎有点像 StandardAnalyzer 在这里服务于你的目的,主要是(区分"aaa_0"和"aaa-0"将是一个问题),只要它被一致地应用,并且你的查询是正确的 .

相关问题