如何使 Nest Elasticsearch 不区分大小写

How to make a Nest Elasticsearch case insensitive

我正在使用 .Net 的 Nest.ElasticSearch 库

我有一个用于索引的模型,其中有一个字段我想按字母顺序 (A-Z) 排序

    [Text(Fielddata = true, Analyzer = "keyword")]
    public string FieldToSort { get; set; }

然后我调用了一个端点,它将使用 Nest.ElasticClient

        if (sortProperty != null)
        {
            SortOrder sortOrder = sortValue != null && sortValue.ToLower() == "asc" ? SortOrder.Ascending : SortOrder.Descending;

            switch (sortProperty.ToLower())
            {
                case "fieldToSort":
                    sortDescriptor.Field(s => s.FieldToSort , sortOrder);
                    break;
            }
        }
        var response = _client.Search<FieldModel>
           (
               s => s.Index("indexName")
               .Query(q => q
                   .Bool(b => b
                       .Filter(filterDescriptor)
                       .Must(sh => string.IsNullOrWhiteSpace(query) ? sh.MatchAll() : sh
                           .MultiMatch(mm => mm
                               .Fields(f => f
                                   .Field(c => c.something, 1)
                                   .Field(c => c.somehingelse, 3)
                               .Query(query)
                               .Operator(Operator.And)
                           )
                       )
                   )
               )
               .TrackTotalHits(true)
               .MinScore(Config.ElasticSearch.MinScore)
               .Sort(so => sortDescriptor)
               .Skip(offset)
               .Take(pageSize)
           );

问题是,当我得到列表时,它似乎是按 A-Za-z 排序的,如果我希望它不区分大小写,那么它不考虑大写还是小写怎么办?

您应该在索引时执行此操作以获得最佳性能。您可以在索引设置中定义一个小写的标准化器:

.Normalizers(norm => norm.Custom("lowercase", cn => cn.Filters("lowercase"));

然后在您的映射中定义它。如果您使用的是基于属性的映射,它将如下所示:

[Keyword(Index = true, Normalizer = "lowercase")]

根据您的 ES 和 NEST 版本,语法可能略有不同,但这是通用方法。