首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同排序顺序的弹性搜索获取距离

问不同排序顺序的弹性搜索获取距离
EN

Stack Overflow用户
提问于 2015-03-05 09:02:27
回答 1查看 1.2K关注 0票数 1

背景:

我们有以下要求:

  1. 应该返回数据匹配关键字。
  2. 数据有经纬度字段,结果应在指定的拉长附近。
  3. 返回的结果应该包含距离字段,该字段指定数据中所包含的给定的拉长和拉长之间的距离。
  4. 数据应按MultiMatch评分进行排序。

阅读本链接空间搜索ElasticSearch教程中的教程,我在C#中构建了以下查询。

代码语言:javascript
复制
 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评分对结果进行排序。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-08 08:47:51

下面的Stackoverflow回答演示了如何在不使用排序的情况下获得距离。

下面是C#的答案。

代码语言:javascript
复制
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))))));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28873748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档