关于c#:ElasticSearch 5.x上下文提示NEST .Net

ElasticSearch 5.x Context Suggester NEST .Net

我正在尝试在ElasticSearch 5.1.2上使用Nest 5.0的上下文建议器创建索引。

当前,我可以创建映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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类中,我不知道必须是哪种对象类型,建议属性标记为?????:

1
2
3
4
5
6
7
8
9
10
11
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上执行上下文建议的方法)

请,任何人都可以提供有关如何执行此操作的示例吗?

文档全部与查询有关。建议者NEST

谢谢。


完成和上下文建议者能够在5.x的响应中返回_source,因此不再需要有效负载。因此,NEST 5.x中的类型现在为CompletionField,而不是NEST 2.x中的CompletionField<TPayload>,其中TPayload是有效负载类型。

下面是一个使用NEST 5.x的示例,它可以帮助您启动并运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
{
 "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返回您感兴趣的字段。