【问题标题】:How to make a Nest Elasticsearch case insensitive如何使 Nest Elasticsearch 不区分大小写
【发布时间】:2021-04-12 10:41:32
【问题描述】:

我正在为 .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,如果我希望它不区分大小写怎么办,所以它不考虑它是大写还是小写?

【问题讨论】:

  • 我看到 2 个解决方案:1) 使用转换为小写的脚本进行排序 2) 使用不区分大小写的分析器 (technetexperts.com/web/…) 将数据复制到另一个字段(使用 copy_to),脚本应该更低,看起来像:sorts.Add(new ScriptSort { Type = "string", Order = SortOrder.Ascending, Script = new InlineScript(doc['fieldtosort'].value.toLowerCase()) });

标签: .net elasticsearch nest


【解决方案1】:

您应该在索引时执行此操作以获得最佳性能。您可以在索引设置中定义小写规范器:

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

然后在您的映射中定义它。如果你使用基于属性的映射,它看起来像这样:

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

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

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多