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&lt;TPayload&gt;,其中 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 完成建议器

Elasticsearch 5.2.x 使用 Head 插件连接不上集群

es使用ElasticSearch的44条建议 性能优化

Elasticsearch 5.2.x 使用 Head 插件连接不上集群(转)

Elasticsearch --- 4. term与match ,修改器,建议器