如何使 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 版本,语法可能略有不同,但这是通用方法。
我正在使用 .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 版本,语法可能略有不同,但这是通用方法。