ElasticSearch 5.x 上下文建议器 NEST .Net
Posted
技术标签:
【中文标题】ElasticSearch 5.x 上下文建议器 NEST .Net【英文标题】:ElasticSearch 5.x Context Suggester NEST .Net 【发布时间】:2017-01-19 16:18:32 【问题描述】:我正在尝试在 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)
)
)
);
但是在 POCO 类中我不知道什么对象类型必须是 Suggest 用 ????? 标记的属性:
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 上执行上下文提示的方法)
请问,谁能提供一个例子来说明如何做到这一点?
文档都是关于查询的。 Suggester NEST
谢谢。
【问题讨论】:
【参考方案1】:Completion 和 Context Suggester 能够在 5.x+ 的响应中返回 _source
,因此不再需要有效负载。因此,NEST 5.x 中的类型现在是 CompletionField
,而不是 NEST 2.x 中的 CompletionField<TPayload>
,其中 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"];
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 Filtering,只返回_source
中你感兴趣的字段。
【讨论】:
别担心!如果有帮助,您也可以投票赞成:)以上是关于ElasticSearch 5.x 上下文建议器 NEST .Net的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch 5.3.x 使用 Head 插件
Elasticsearch 5.2.x 使用 Head 插件连接不上集群