基于Nest 7.17:如何用Completion Suggester实现多字段自动搜索与自动映射
Elasticsearch Completion Suggester 实现多字段权重排序(Nest 7.17)
1. 创建包含多字段值的Completion字段
要实现多字段内容的自动补全并按权重排序,你可以在索引文档时,将字段a、b、c、d的内容分别作为Completion字段的输入项,并为不同来源字段设置差异化权重:
- 给字段a、b、c的输入项设置较高权重(如10),确保它们的建议优先展示
- 给字段d的输入项设置较低权重(如1)
实体类定义(Nest)
public class YourDocument { public string a { get; set; } public string b { get; set; } public string c { get; set; } public string d { get; set; } // 定义用于自动补全的Completion字段 public CompletionField Suggest { get; set; } }
索引文档时构造Suggest字段
在写入文档前手动构建Suggest字段的输入列表,为不同来源字段分配权重:
var document = new YourDocument { a = "内容A", b = "内容B", c = "内容C", d = "内容D", Suggest = new CompletionField { Input = new List<InputOption> { new InputOption { Input = "内容A", Weight = 10 }, new InputOption { Input = "内容B", Weight = 10 }, new InputOption { Input = "内容C", Weight = 10 }, new InputOption { Input = "内容D", Weight = 1 } } } }; // 索引文档到Elasticsearch await client.IndexDocumentAsync(document);
2. 实现Completion字段的自动索引映射
你可以通过两种方式让Nest自动生成正确的Completion字段映射:
方式一:使用Data Annotation标注实体类
直接在实体类的Suggest字段上添加CompletionAttribute,Nest会在创建索引时自动生成对应映射:
public class YourDocument { public string a { get; set; } public string b { get; set; } public string c { get; set; } public string d { get; set; } [Completion] public CompletionField Suggest { get; set; } } // 创建索引时自动应用映射 await client.Indices.CreateAsync("your_index", c => c .Map<YourDocument>(m => m.AutoMap()) );
方式二:手动配置映射(更灵活)
如果需要自定义Completion字段参数(如最大输入长度),可在创建索引时手动配置:
await client.Indices.CreateAsync("your_index", c => c .Map<YourDocument>(m => m .Properties(p => p .Text(t => t.Name(n => n.a)) .Text(t => t.Name(n => n.b)) .Text(t => t.Name(n => n.c)) .Text(t => t.Name(n => n.d)) .Completion(co => co .Name(n => n.Suggest) .MaxInputLength(50) // 自定义最大输入长度 ) ) ) );
执行补全查询
构造Completion Suggester查询,获取前5条优先展示高权重内容的建议:
var response = await client.SearchAsync<YourDocument>(s => s .Suggest(su => su .Completion("suggestions", c => c .Field(f => f.Suggest) .Prefix("你的输入前缀") .Size(5) // 返回前5条结果 ) ) ); // 处理返回的建议结果 var suggestions = response.Suggest["suggestions"].First()?.Options;
内容的提问来源于stack exchange,提问作者anoop francis
相关产品推荐
相关产品推荐

