Elasticsearch 6.3 - Как сортировать на анализируемом поле? - PullRequest
0 голосов
/ 09 октября 2018

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

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

Я пыталсядекорирование свойства в моей модели свойствами [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 голосов
/ 09 октября 2018

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

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

...