问题描述
我正在尝试实现一个示例代码,该示例代码使用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:“类型:invalid_argument_exception原因:“未为字段[suggest]找到映射”“ CausedBy:“类型:非法_argument_exception原因:“未为字段[suggest]找到映射”” >
使用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; }
}
,
看起来像候选索引,并且在发出带有映射请求的创建索引时,建议字段可能已经存在。您可以检查返回的CreateIndexResponse
,以查看是否为这种情况; IsValid
属性为false,响应中的错误详细信息将说明原因。
Elasticsearch的默认行为是在索引请求进入时将创建索引和映射,以将文档编入索引,并根据它看到的第一个文档推断字段的映射。这对于许多用例来说都是有用的行为,但是对于搜索用例,您通常希望在执行操作时使用显式映射来控制索引的创建,因此可以通过设置action.auto_create_index
cluster setting to false
.来关闭此行为。现在,如果您删除索引并使用创建索引请求再次重新创建,则在有机会明确创建索引之前,将不会自动创建该索引。
是的,在为未根据我描述的映射定义创建的文档建立索引的同时,创建了映射定义。 如预期的那样,检查CreateIndexResponse IsValid属性可指示问题。
我花了一些时间找出根本问题:我使用的是ES Docker映像版本6.3.0和Nest Client 7. *。 使我的ES与Nest客户端兼容可以解决此问题。
谢谢您的帮助。