Osc*_*dré 2 .net c# elasticsearch nest
我正在尝试使用ElasticSearch 5.1.2上的Nest 5.0创建一个带有上下文建议的索引.
目前,我可以创建映射:
elasticClient.MapAsync<EO_CategoryAutocomplete>(m => m
.Properties(p => p
.Completion(c => c
.Contexts(ctx => ctx
.Category(csug => csug
.Name("lang")
.Path("l")
)
.Category(csug => csug
.Name("type")
.Path("t")
)
.Category(csug => csug
.Name("home")
.Path("h")
)
)
.Name(n => n.Suggest)
)
)
);
Run Code Online (Sandbox Code Playgroud)
但在POCO类我不知道什么对象类型必须是标题为?????的建议属性 :
public class EO_CategoryAutocomplete
{
public string Id { get; set; }
public ????? Suggest { get; set; }
}
public class EO_CategoryAC
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在NEST 5.0中,CompletionField属性已被删除(这是在elasticsearch 2.X上执行上下文建议的方法)
请问,任何人都可以举例说明如何做到这一点吗?
文档都是关于查询的.建议NEST
谢谢.
完成和上下文建议器能够_source在5.x +中返回响应,因此不再需要有效负载.因此,现在NEST 5.x中的类型CompletionField与CompletionField<TPayload>NEST 2.x 相反,其中TPayload有效载荷类型.
这是NEST 5.x的一个例子,可以让您启动并运行
public class EO_CategoryAutocomplete
{
public string Id { get; set; }
public IEnumerable<string> L { get; set; }
public CompletionField Suggest { get; set; }
}
void Main()
{
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var connectionSettings = new ConnectionSettings(pool)
.DefaultIndex("autocomplete");
var client = new ElasticClient(connectionSettings);
if (client.IndexExists("autocomplete").Exists)
client.DeleteIndex("autocomplete");
client.CreateIndex("autocomplete", ci => ci
.Mappings(m => m
.Map<EO_CategoryAutocomplete>(mm => mm
.AutoMap()
.Properties(p => p
.Completion(c => c
.Contexts(ctx => ctx
.Category(csug => csug
.Name("lang")
.Path("l")
)
.Category(csug => csug
.Name("type")
.Path("t")
)
.Category(csug => csug
.Name("home")
.Path("h")
)
)
.Name(n => n.Suggest)
)
)
)
)
);
client.IndexMany(new[] {
new EO_CategoryAutocomplete
{
Id = "1",
Suggest = new CompletionField
{
Input = new [] { "async", "await" },
// explicitly pass a context for lang
Contexts = new Dictionary<string, IEnumerable<string>>
{
{ "lang", new [] { "c#" } }
}
}
},
new EO_CategoryAutocomplete
{
Id = "2",
Suggest = new CompletionField
{
Input = new [] { "async", "await" },
// explicitly pass a context for lang
Contexts = new Dictionary<string, IEnumerable<string>>
{
{ "lang", new [] { "javascript" } }
}
}
},
new EO_CategoryAutocomplete
{
Id = "3",
// let completion field mapping extract lang from the path l
L = new [] { "typescript" },
Suggest = new CompletionField
{
Input = new [] { "async", "await" },
}
}
}, "autocomplete");
client.Refresh("autocomplete");
var searchResponse = client.Search<EO_CategoryAutocomplete>(s => s
.Suggest(su => su
.Completion("categories", cs => cs
.Field(f => f.Suggest)
.Prefix("as")
.Contexts(co => co
.Context("lang",
cd => cd.Context("c#"),
cd => cd.Context("typescript"))
)
)
)
);
// do something with suggestions
var categorySuggestions = searchResponse.Suggest["categories"];
}
Run Code Online (Sandbox Code Playgroud)
该searchResponse收益
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : 0.0,
"hits" : [ ]
},
"suggest" : {
"categories" : [
{
"text" : "as",
"offset" : 0,
"length" : 2,
"options" : [
{
"text" : "async",
"_index" : "autocomplete",
"_type" : "eo_categoryautocomplete",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"id" : "3",
"l" : [
"typescript"
],
"suggest" : {
"input" : [
"async",
"await"
]
}
},
"contexts" : {
"lang" : [
"typescript"
]
}
},
{
"text" : "async",
"_index" : "autocomplete",
"_type" : "eo_categoryautocomplete",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"id" : "1",
"suggest" : {
"input" : [
"async",
"await"
],
"contexts" : {
"lang" : [
"c#"
]
}
}
},
"contexts" : {
"lang" : [
"c#"
]
}
}
]
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
用ids "1"和suggest建议文件"3".您还可以使用" 源过滤"仅返回您感兴趣的字段_source.