Elasticsearch 6.3 — Как сортировать анализируемое поле?

Итак, я нашел примеры этого для более старых версий Elastic, но из-за изменения синтаксиса я не смог перевести эти решения в синтаксис 6.3.

У меня есть поле ShowName (String), к которому я применил анализатор N-грамм. Проблема в том, что мне также нужно сортировать по этому полю. Прежде чем я добавил анализатор, я получил подсвойство «Суффикс ключевого слова» и смог без проблем сортировать, однако после добавления анализатора у меня больше нет доступа к этому подсвойству ключевого слова.

Я попытался украсить свойство в своей модели свойствами [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")))
                            )
                        )
                    )
                )
            )
        );

Изменить: в соответствии с полученным ответом окончательный синтаксис для блока кода выглядит следующим образом (теперь содержит несколько полей Multi в коде).

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"))
                                )
                            )
                        )
                    )
                )
            )
        );

person Kenny Steen    schedule 09.10.2018    source источник


Ответы (1)


String тип поля был разделен на keyword и text начиная с Elasticsearch 5.0. Text поля нельзя использовать для сортировки, поэтому необходимо создать multi-field: с типом text для полнотекстового поиска и с типом keyword для агрегирования и сортировки.

Но в вашем примере вы создаете два поля text и используете keyword в качестве суффикса имени поля, а не типа поля (насколько я понимаю синтаксис C#).

person Alexey Prudnikov    schedule 09.10.2018
comment
Это было то объяснение, которое мне было нужно! Потребовалось немного возиться, чтобы получить точный синтаксис, но спасибо за указатели. Точный синтаксис сейчас под вопросом. - person Kenny Steen; 09.10.2018
comment
Пожалуйста! К сожалению, я плохо знаю C#, поэтому мне было сложно предоставить точный фрагмент кода. - person Alexey Prudnikov; 09.10.2018
comment
Я добавил фрагмент кода, который использовал, к исходному вопросу. Твоего совета было более чем достаточно, чтобы указать мне правильное направление :) - person Kenny Steen; 09.10.2018