c# - Elasticsearch 使用不同排序顺序获取距离

标签 c# elasticsearch nest

背景:

我们有以下要求:

  1. Data matching keyword should be returned.
  2. Data has longitude and latitude fields, result should be near specified lat long.
  3. Returned result should contain distance field, which specified distance between given lat long and lat long contained in data.
  4. Data should be sorted accouding to MultiMatch score.

阅读此链接中的教程 Spatial Search ElasticSearch tutorial我在 C# 中构造了以下查询。

 var res = await _elasticClient
            .SearchAsync<Results>(
                s =>
                    s.Type("Data")
                        .Skip(skip)
                        .Take(limit)
                      .SortGeoDistance(es => 
                            es.Ascending().OnField("Coordinates").Unit(GeoUnit.Kilometers).PinTo(lat,lng))
                      .Query(
                        q1 =>
                            q1.Filtered(
                                f1 =>
                                    f1.Query(q2 => q2.MultiMatch(mm => mm.OnFields(MultiMatchFieldsArray)
                                    .Query(keyword)
                                    .Type(TextQueryType.MostFields)))
                                    .Filter(f2 => f2.GeoDistance("Coordinates",gf => gf.Distance(10,GeoUnit.Kilometers)
                                    .Location(lat,lng))))));

根据教程,我必须使用 SortGeoDistance 方法来获取结果中的距离。使用SortGeoDistance会根据距离对结果进行排序,但需要根据MultiMatch得分对结果进行排序。

最佳答案

已关注 Stackoverflow answer展示如何在不使用排序的情况下获取距离。

下面是 C# 的等效答案。

var esSearch = await _elasticClient
            .SearchAsync<Results>(
                s =>
                    s.Type("Data")
                      .Skip(skip)
                      .Take(limit)
                      .Fields("_source")
                      .ScriptFields(sf => sf.Add("Distance", des => des.Params(param => param.Add("lat", lat).Add("lon", lng)).Script("doc[\u0027Coordinates\u0027].arcDistanceWithDefault(lat,lon,-1)")))
                      .Query(
                        q1 =>
                            q1.Filtered(
                                f1 =>
                                    f1.Query(q2 => q2.MultiMatch(mm => mm.OnFields(MultiMatchFields)
                                    .Query(keyword)
                                    .Type(TextQueryType.MostFields)))
                                    .Filter(f2 => f2.GeoDistance("Coordinates",gf => gf.Distance(10,GeoUnit.Kilometers)
                                    .Location(lat,lng))))));

关于c# - Elasticsearch 使用不同排序顺序获取距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28873748/

相关文章:

c# - 奇怪的自定义操作

c# - 如何从这个定时器的回调函数中更改 System.Threading.Timer 中的间隔时间?

c# - 拆分列表中的每个两个单词的字符串,比较是否相同并使用 Linq 进行计数

elasticsearch - 使用 ElasticSearch 寻找趋势

Elasticsearch NEST 客户端创建多字段并完成

c# - IMemoryCache 不在应用程序启动时保存数据

elasticsearch - 调整仅某些查询的相关性得分

json - 如何通过键值对elasticsearch数组中的键来匹配数组值?

c# - 如何使用ElasticSearch NEST获取其列表包含某些参数的对象?

elasticsearch - 如何使用 NEST Bulk Api 将文档添加到 elasticsearch