ElasticSearch - Elasticsearch.Net - 如何使用自定义分析器和动态模板进行精确搜索

问题描述

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

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

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...