ElasticSearch 5.x Context Suggester NEST .Net

后端 未结 1 574
梦谈多话
梦谈多话 2021-01-07 00:08

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.MapA         


        
1条回答
  •  孤独总比滥情好
    2021-01-07 00:51

    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 in NEST 2.x, where TPayload is the payload type.

    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 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(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>
                    {
                        { "lang", new [] { "c#" } }
                    }
                }
            },
            new EO_CategoryAutocomplete
            {
                Id = "2",
                Suggest = new CompletionField
                {
                    Input = new [] { "async", "await" },
                    // explicitly pass a context for lang
                    Contexts = new Dictionary>
                    {
                        { "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(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"];
    }
    

    The searchResponse returns

    {
      "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#"
                  ]
                }
              }
            ]
          }
        ]
      }
    }
    

    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.

    0 讨论(0)
提交回复
热议问题