带有特殊字符的 ElasticSearch 电子邮件地址,例如 @
ElasticSearch email address with special characters like @
我正在使用 ElasticSearch v6.8 和 NEST 客户端,编写 C# 代码。我正在使用流畅的映射。
我正在为一个电子邮件字段编制索引,因此可以通过搜索他们的电子邮件地址找到用户。标准分析器不起作用,然后我阅读了有关使用 uax_url_email
分词器的信息。我插入它,它比标准分析器工作得更好,但我仍然无法使用 @ 字符或“.”进行搜索。特点。示例:输入 "firstname" 得到一个匹配项。输入 "firstname@" 不匹配。输入 "firstname.lastname" 也不匹配。
我做错了什么?我假设 uax_url_email
分词器会处理这个。我改为使用 NGram,然后它就可以工作了,但是现有的内置电子邮件分析器不处理 @ 符号和类似符号似乎很奇怪。
这是我的字段映射(它是一个纯字符串):
.Map<UserSearchEntity>(
m => m
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Email)
.Analyzer("user_email_analyzer")))
分析器之前已经用 uax_url_email 分词器注册。
这是一个简单的应用程序,展示了 uax_url_email 分词器的用法。
{
var createIndexResponse = await client.CreateIndexAsync("my_index", c => c
.Settings(s => s.Analysis(a => a
.Analyzers(an => an.Custom("my_analyzer", cu => cu.Tokenizer("my_tokenizer")))
.Tokenizers(t => t.UaxEmailUrl("my_tokenizer", u => u.MaxTokenLength(3)))))
.Mappings(m => m
.Map<Document>(map => map
.Properties(p => p.Text(t => t.Name(n => n.Email).Analyzer("my_analyzer"))))));
var indexResponse = await client.IndexAsync(new Document {Id = "1", Email = "robert.lyson@domain.com"},
i => i.Refresh(Refresh.WaitFor));
await Search(client, "robert.lyson");
await Search(client, "robert");
await Search(client, "lyson");
await Search(client, "@domain.com");
await Search(client, "domain.com");
await Search(client, "rob");
}
private static async Task Search(ElasticClient client, string query)
{
var searchResponse = await client.SearchAsync<Document>(s => s
.Query(q => q.Match(m => m.Field(f => f.Email).Query(query))));
System.Console.WriteLine($"result for query \"{query}\": {string.Join(",", searchResponse.Documents.Select(x => x.Email))}");
}
public class Document
{
public string Id { get; set; }
public string Email { get; set; }
}
输出:
result for query "robert.lyson": robert.lyson@domain.com
result for query "robert": robert.lyson@domain.com
result for query "lyson": robert.lyson@domain.com
result for query "@domain.com": robert.lyson@domain.com
result for query "domain.com": robert.lyson@domain.com
result for query "rob": robert.lyson@domain.com
使用 elasticsearch 6.8.0 和 NEST 6 进行测试。8.x。
希望对您有所帮助。
我正在使用 ElasticSearch v6.8 和 NEST 客户端,编写 C# 代码。我正在使用流畅的映射。
我正在为一个电子邮件字段编制索引,因此可以通过搜索他们的电子邮件地址找到用户。标准分析器不起作用,然后我阅读了有关使用 uax_url_email
分词器的信息。我插入它,它比标准分析器工作得更好,但我仍然无法使用 @ 字符或“.”进行搜索。特点。示例:输入 "firstname" 得到一个匹配项。输入 "firstname@" 不匹配。输入 "firstname.lastname" 也不匹配。
我做错了什么?我假设 uax_url_email
分词器会处理这个。我改为使用 NGram,然后它就可以工作了,但是现有的内置电子邮件分析器不处理 @ 符号和类似符号似乎很奇怪。
这是我的字段映射(它是一个纯字符串):
.Map<UserSearchEntity>(
m => m
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.Email)
.Analyzer("user_email_analyzer")))
分析器之前已经用 uax_url_email 分词器注册。
这是一个简单的应用程序,展示了 uax_url_email 分词器的用法。
{
var createIndexResponse = await client.CreateIndexAsync("my_index", c => c
.Settings(s => s.Analysis(a => a
.Analyzers(an => an.Custom("my_analyzer", cu => cu.Tokenizer("my_tokenizer")))
.Tokenizers(t => t.UaxEmailUrl("my_tokenizer", u => u.MaxTokenLength(3)))))
.Mappings(m => m
.Map<Document>(map => map
.Properties(p => p.Text(t => t.Name(n => n.Email).Analyzer("my_analyzer"))))));
var indexResponse = await client.IndexAsync(new Document {Id = "1", Email = "robert.lyson@domain.com"},
i => i.Refresh(Refresh.WaitFor));
await Search(client, "robert.lyson");
await Search(client, "robert");
await Search(client, "lyson");
await Search(client, "@domain.com");
await Search(client, "domain.com");
await Search(client, "rob");
}
private static async Task Search(ElasticClient client, string query)
{
var searchResponse = await client.SearchAsync<Document>(s => s
.Query(q => q.Match(m => m.Field(f => f.Email).Query(query))));
System.Console.WriteLine($"result for query \"{query}\": {string.Join(",", searchResponse.Documents.Select(x => x.Email))}");
}
public class Document
{
public string Id { get; set; }
public string Email { get; set; }
}
输出:
result for query "robert.lyson": robert.lyson@domain.com
result for query "robert": robert.lyson@domain.com
result for query "lyson": robert.lyson@domain.com
result for query "@domain.com": robert.lyson@domain.com
result for query "domain.com": robert.lyson@domain.com
result for query "rob": robert.lyson@domain.com
使用 elasticsearch 6.8.0 和 NEST 6 进行测试。8.x。
希望对您有所帮助。