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

时间:2013-08-28 19:51:11

标签: lucene elasticsearch tire

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

使用电子邮件“stack@domain.com”,搜索“堆叠”,“@ domain.com”,“domain.com”或“域名”会让我找回所需的电子邮件地址。

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

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

  1. for index_analyzer
    • 使用“keyword”,“whitespace”或“uax_url_email”令牌化程序,以便电子邮件不会被标记化
      • 但是通配符查询似乎不起作用(至少有轮胎)
    • 使用“nGram”或​​“edgeNGram”进行过滤
      • 我总是得到太多不必要的结果,例如在搜索“第一秒”时收到“first@domain.com”。
  2. 用于search_analyzer
    • 不要做nGram
  3. 一个实验代码

    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,搜索”aaa“给我”aaa@a.com“”aaa-0 @ email.com。搜索“aaa *”给了我一切,但“aaa- *”没有给我任何东西。那么,我该怎么做完全匹配通配符查询?对于这些类型的查询,我得到了与不同的tokenizer / analyzer相同的结果。

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

    参考文献:

1 个答案:

答案 0 :(得分:0)

考虑到您要完成的任务,KeywordAnalyzer可能是分析器的合理选择,但我没有看到任何会导致WhitespaceAnalyzer出现问题的内容。

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

看起来有点像StandardAnalyzer在这里服务于你的目的,主要是(区分“aaa_0”和“aaa-0”会有问题),只要它被一致地应用,并且你的查询是对的。