Elasticsearch 6.3-如何在分析字段上排序?

时间:2018-10-09 08:54:28

标签: c# elasticsearch elasticsearch-6

因此,我找到了适用于旧版本Elastic的示例,但是由于语法的更改,我无法将这些解决方案转换为6.3语法。

我有一个字段ShowName(字符串),已将N-Gram分析器应用于该字段。问题是我还需要按该字段排序。在添加分析器之前,我已经获得了关键字后缀子属性,并且无法进行任何排序,但是,由于添加了分析器,我现在无法访问该关键字子属性。

我尝试使用[Text(Analyzer = "nGram_analyzer")])Keyword属性装饰模型中的属性,但是在创建索引时出现错误消息:

  

找到了多个相同类型的自定义属性。

然后我尝试在创建索引时(在下面的代码中)在映射中显式添加两个字段,尽管这会创建两个字段,但是我仍然无法通过关键字后缀字段进行排序。谁能指出我要去哪里错了?

var createIndexResponse = client.CreateIndex(shows, c => c
            .Settings(s => s
                .Analysis(a => a
                    .TokenFilters(t => t.NGram("nGram_filter", ng => ng.MinGram(3).MaxGram(10)))
                    .Analyzers(aa => aa
                        .Custom("nGram_analyzer", cc => cc
                            .Tokenizer("whitespace")
                            .Filters(nGramFilters1)
                        )
                    )
                )
            )
            .Mappings(ms => ms
                .Map<ShowElasticSearchModel>(m => m
                    .AutoMap<ShowElasticSearchModel>()
                    .Properties(p => p
                        .Text(t => t
                            .Name(n => n.ShowName)
                            .Analyzer("nGram_analyzer")
                            .Fields(fs => fs
                                .Text(tt => tt.Name(nn => nn.ShowName.Suffix("keyword")))
                            )
                        )
                    )
                )
            )
        );

编辑:从收到的答案开始,代码块的最终语法如下(现在代码中包含多个“多字段”)。

var createIndexResponse = client.CreateIndex(shows, c => c
            .Settings(s => s
                .Analysis(a => a
                    .TokenFilters(t => t.NGram("nGram_filter", ng => ng.MinGram(3).MaxGram(10)))
                    .Analyzers(aa => aa
                        .Custom("nGram_analyzer", cc => cc
                            .Tokenizer("whitespace")
                            .Filters(nGramFilters1)
                        )
                    )
                )
            )
            .Mappings(ms => ms
                .Map<ShowElasticSearchModel>(m => m
                    .AutoMap<ShowElasticSearchModel>()
                    .Properties(p => p
                        .Text(t => t
                            .Name(n => n.ShowName)
                            .Analyzer("nGram_analyzer")
                            .Fields(ff => ff
                                .Keyword(k => k
                                    .Name(n => n.ShowName.Suffix("keyword"))
                                )
                            )
                        )
                        .Text(t => t
                            .Name(n => n.Organisation)
                            .Analyzer("nGram_analyzer")
                            .Fields(ff => ff
                                .Keyword(k => k
                                    .Name(n => n.Organisation.Suffix("keyword"))
                                )
                            )
                        )
                        .Text(t => t
                            .Name(n => n.Venues)
                            .Analyzer("nGram_analyzer")
                            .Fields(ff => ff
                                .Keyword(k => k
                                    .Name(n => n.Venues.Suffix("keyword"))
                                )
                            )
                        )
                    )
                )
            )
        );

1 个答案:

答案 0 :(得分:1)

自Elasticsearch 5.0起,

String字段类型已从WHATWG living standardsplitkeyword类型。 Text字段不能用于排序,因此您需要创建text:类型为text的用于全文搜索,类型为keyword的用于聚合和排序。 / p>

但是在您的示例中,您创建了两个text字段,并使用keyword作为字段名称后缀而不是字段类型(据我所能理解的C#语法)。