0

我正在尝试使用 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 的学生。

我不确定我做错了什么。有人有建议吗?

感谢你的帮助!

4

0 回答 0