我正在尝试使用 Elasticsearch.Net v7.7 在我的新索引中创建索引并使用精确值进行搜索
我有一个对象如下
public class Student
{
public int Id { get; set; }
public Info PersonalInfo { get; set; }
public DateTime CreatedDate { get; set; }
}
public class Info
{
public string Name { get; set; }
public string Email { get; set; }
}
我使用自定义电子邮件分析器和上述对象的动态模板创建索引
client.Indices.Create(this.DefaultIndex, c => c
.Settings(s => s
.Analysis(a => a.Analyzers(an => an.Custom("email", cus => cus.Tokenizer("uax_url_email")))))
.Map<Student>(map => map
.DynamicTemplates(dy => dy.DynamicTemplate("PersonalInfo", d => d.PathMatch("PersonalInfo.Email").Mapping(m => m.Text(t => t
.Name(n => n.PersonalInfo.Email)
.Analyzer("email")
))))
.AutoMap()
)
);
我的学生名单
var students = new List<Student>() {
new Student() {
Id = 1,
PersonalInfo = new Info() {
Name = "Test 1",
Email = "test1.student@domain.com",
},
CreatedDate = DateTime.Now
},
new Student() {
Id = 2,
PersonalInfo = new Info() {
Name = "Test 2",
Email = "test2.student@domain.com",
},
CreatedDate = DateTime.Now
},
new Student() {
Id = 3,
PersonalInfo = new Info() {
Name = "Test 3",
Email = "test3.student@domain.com",
},
CreatedDate = DateTime.Now
}
}
然后使用以下方法索引所有学生
public BulkResponse IndexAllStudents(List<Student> students)
{
return client.IndexMany(students, this.DefaultIndex);
}
当我尝试搜索确切的电子邮件地址“test1.student@domain.com”时
var result = client.Search<Student>(s => s
.From(0).Size(10)
.Query(q => q.Match(m => m
.Query("test1.student@domain.com")
.Field(fi => fi.PersonalInfo.Email)
.Analyzer("email")
)
).Sort(q => q.Descending(fi => fi.CreatedDate)));
结果给了我 0 个文件
但是当我尝试不使用分析器进行搜索时
var result = client.Search<CreditApplication>(s => s
.From(0).Size(10)
.Query(q => q.Match(m => m
.Query("test1.student@domain.com")
.Field(fi => fi.PersonalInfo.Email)
)
).Sort(q => q.Descending(fi => fi.CreatedDate)));
结果给了我所有被索引的学生。
以上结果都不是我所期望的。使用“test1.student@domain.com”搜索时,我只想接收 ID = 1 的学生。
我不确定我做错了什么。有人有建议吗?
感谢你的帮助!