问题描述
我正在为 .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 版本,语法可能略有不同,但这是通用方法。