【问题标题】:Elasticsearch 6.3 - How to Sort on an Analyzed field?Elasticsearch 6.3 - 如何对分析的字段进行排序?
【发布时间】:2018-10-09 08:54:27
【问题描述】:

因此,我找到了旧版本 Elastic 的示例,但由于语法发生变化,我无法将这些解决方案转换为 6.3 语法。

我有一个字段,ShowName (String),我已经应用了 N-Gram 分析器。问题是我还需要按该字段排序。在我添加分析器之前,我得到了 Keyword suffix 子属性并且能够轻松排序,但是,自从添加了分析器后,我现在无法访问该关键字子属性。

我尝试使用[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"))
                                )
                            )
                        )
                    )
                )
            )
        );

【问题讨论】:

    标签: c# elasticsearch elasticsearch-6


    【解决方案1】:

    String 字段类型自 Elasticsearch 5.0 以来一直是 splitkeywordtext 类型。 Text 字段不能用于排序,所以需要创建multi-field: 类型为text 用于全文搜索,类型为keyword 用于聚合和排序。

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

    【讨论】:

    • 这就是我需要的解释!花了一些时间来获得确切的语法,但感谢您的指点。确切的语法现在是问题。
    • 不客气!不幸的是我不太了解C#,所以我很难提供确切的代码sn-p。
    • 我已将我使用的代码 sn-p 添加到原始问题中。您的建议足以为我指明正确的方向:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多