ElasticSearch 5.x上下文建议器NEST .Net [英] ElasticSearch 5.x Context Suggester NEST .Net
问题描述
我正在尝试在ElasticSearch 5.1.2上的Nest 5.0中创建带有上下文建议器的索引.
I'm trying to create an Index with a context suggester with Nest 5.0 on ElasticSearch 5.1.2.
当前,我可以创建映射:
Currently, I can create the mapping:
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)
)
)
);
但是在POCO类中,我不知道哪种对象类型必须是 Suggest 标有 ????? 的属性:
But in the POCO class i dont know what object type must be Suggest Property marked with ?????:
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; }
}
在NEST 5.0中, CompletionField 属性已删除(这是在Elasticsearch 2.X上执行上下文建议的方法)
In NEST 5.0 CompletionField Property has been removed (That was the method to do context suggester on elasticsearch 2.X)
请,任何人都可以提供有关如何执行此操作的示例吗?
Please, can anyone provide an example about how to do it?
文档全部与查询有关. Suggester NEST
The documentation is all about querying. Suggester NEST
谢谢.
推荐答案
完成和上下文建议程序能够在5.x +的响应中返回_source
,因此不再需要有效负载.因此,NEST 5.x中的类型现在为CompletionField
,而不是NEST 2.x中的CompletionField<TPayload>
,其中TPayload
是有效负载类型.
The Completion and Context Suggester are able to return the _source
in the response in 5.x+, so no longer require a payload. Because of this, the type in NEST 5.x is now CompletionField
, as opposed to CompletionField<TPayload>
in NEST 2.x, where TPayload
is the payload type.
以下是NEST 5.x的示例,可以帮助您入门和运行
Here's an example with NEST 5.x to get you up and running
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"];
}
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#"
]
}
}
]
}
]
}
}
建议使用ID为"1"
和"3"
的文档.您还可以使用源过滤,仅从_source
返回您感兴趣的字段.
suggesting documents with ids "1"
and "3"
. You can also use Source Filtering to only return the fields that you are interested in from _source
.
这篇关于ElasticSearch 5.x上下文建议器NEST .Net的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!