在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 回答
考虑到你想要完成的事情,
KeywordAnalyzer
可能是分析仪的合理选择,尽管我没有看到任何会导致WhitespaceAnalyzer
问题的事情 .我怀疑你遇到了查询解析和分析的问题,尽管你还没有真正描述过如何查询 . 最简单的情况是简单地使用term或prefix查询 .
它似乎有点像
StandardAnalyzer
在这里服务于你的目的,主要是(区分"aaa_0"和"aaa-0"将是一个问题),只要它被一致地应用,并且你的查询是正确的 .