c# - 如何实现 Elasticsearch Suggester?
问题描述
我正在尝试实现一个使用 Elastic Search 中的建议功能的示例代码。
索引文档由平面 POCO 组成
public class CandidateDocument
{
public Guid Id { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public DateTime BirthDate { get; set; }
public CompletionField Suggest { get; set; }
}
映射如下
var client = new ElasticClient(settings);
client.Indices.Create("candidates", c =>
c.Map<CandidateDocument>(m =>
m.Properties(ps => ps.Text(s => s.Name(n => n.Name)
.Store(false)
.Fields(f => f.Keyword(k => k.Name("nameRaw"))))
.Text(s => s.Name(n => n.FirstName)
.Store(false)
.Fields(f => f.Keyword(k => k.Name("firstNameRaw"))
.Date(s => s.Name(n => n.BirthDate).Format("ddMMyyyy"))
.Keyword(s => s.Name(n => n.Id))))
.Completion(c => c.Name(n => n.Suggest)))));
索引文档如下所示:
var candidateDocument = new CandidateDocument
{
Id = Guid.NewGuid(),
Name = "Lennon",
FirstName = "John",
BirthDate = DateTime.Now,
Suggest = new CompletionField
{
Input = new[] { "Lennon" },
}
};
var indexResponse = await this.elasticClient.IndexAsync(candidateDocument, i => i.Index("candidates"));
我的查询是:
var searchResponse = await this.elasticClient.SearchAsync<CandidateDocument>(s => s.Index("candidates").Suggest(su => su
.Completion("suggestions", c => c
.Field(f => f.Suggest)
.Prefix(query)
.Fuzzy(f => f.Fuzziness(Fuzziness.Auto))
.Size(5))));
我面临以下问题:
Elasticsearch.Net.ElasticsearchClientException:请求执行失败。呼叫:状态代码 400 来自:POST /candidates/_search?typed_keys=true。ServerError:类型:search_phase_execution_exception 原因:“所有分片失败” CausedBy:“类型:非法参数异常原因:“未找到字段 [建议] 的映射” CausedBy:“类型:非法参数异常原因:“未找到字段 [建议] 的映射”
使用 kibana 查看我的索引映射:
"suggest": {
"properties": {
"input": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
顺便说一句,我在 .NET Core 3.1 中使用最新版本的 Nest (7.9.0)
我会很感激你的帮助。
解决方案
有同样的问题,通过显式映射解决:
_elasticClient.Indices.Create("candidates", c => c
.Map<CandidateDocument>(m => m
.Properties(ps => ps
.Completion(s => s
.Name(n => n.Suggest)))));
public class CandidateDocument
{
public Guid? Id { get; set; }
public CompletionField Suggest { get; set; }
}
推荐阅读
- javascript - 在 this.state 构造函数中访问状态对象
- rest - 发布不存在的 ID 时,REST API 是否应该返回 404?
- selenium - 尽管脚本按预期运行良好,但在 Selenium 中抛出 InvalidArgument 异常
- xml - 为什么 FOP 在没有任何内容的情况下给我打印一个额外的空白页?
- angular - TypeError: _this.$instance.slick 不是函数
- c# - Azure 函数从 FTP 解析 CSV 以将其保存在 Azure SQL DB 中
- python - 如何实时更改python sounddevice中的麦克风数据
- javascript - 如何在点击时设置图标名称
- javascript - 使用 ag-Grid 为每一行添加唯一的 id
- ruby-on-rails - 参数化 ActiveRecord #joins 方法