Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同排序顺序的弹性搜索距离_C#_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nest - Fatal编程技术网 elasticsearch,nest,C#,elasticsearch,Nest" /> elasticsearch,nest,C#,elasticsearch,Nest" />

C# 不同排序顺序的弹性搜索距离

C# 不同排序顺序的弹性搜索距离,c#,elasticsearch,nest,C#,elasticsearch,Nest,背景: 我们有以下要求: 应返回数据匹配关键字 数据具有经度和纬度字段,结果应接近指定的纬度 返回的结果应包含距离字段,该字段指定了数据中包含的给定lat long和lat long之间的距离 数据应根据多重匹配分数进行排序 在阅读此链接中的教程时,我用C#构建了以下查询 var res=wait\u elasticClient .SearchAsync( s=> s、 类型(“数据”) .Skip(Skip) .接受(限制) .SortGeoDistance(es=> es.Ascending

背景:

我们有以下要求:

  • 应返回数据匹配关键字
  • 数据具有经度和纬度字段,结果应接近指定的纬度
  • 返回的结果应包含距离字段,该字段指定了数据中包含的给定lat long和lat long之间的距离
  • 数据应根据多重匹配分数进行排序
  • 在阅读此链接中的教程时,我用C#构建了以下查询

    var res=wait\u elasticClient
    .SearchAsync(
    s=>
    s、 类型(“数据”)
    .Skip(Skip)
    .接受(限制)
    .SortGeoDistance(es=>
    es.Ascending().OnField(“坐标”).Unit(地理单位.km).PinTo(纬度,液化天然气))
    .查询(
    q1=>
    q1.过滤(
    f1=>
    f1.查询(q2=>q2.MultiMatch(mm=>mm.OnFields)(MultiMatchFieldsArray)
    .Query(关键字)
    .Type(TextQueryType.MostFields)))
    .Filter(f2=>f2.地理距离(“坐标”,gf=>gf.距离(10,地理单位.公里)
    .地点(拉丁美洲,液化天然气()()()));
    
    根据教程,我必须使用SortGeoDistance方法来获得结果中的距离。使用SortGeoDistance将根据距离对结果进行排序,但需要根据多重匹配分数对结果进行排序。

    以下说明如何在不使用排序的情况下获得距离

    下面是答案的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))))));
    
    var-esSearch=wait\u elasticClient
    .SearchAsync(
    s=>
    s、 类型(“数据”)
    .Skip(Skip)
    .接受(限制)
    .Fields(“\u源”)
    .ScriptFields(sf=>sf.Add(“距离”,des=>des.Params(param=>param.Add(“lat”,lat).Add(“lon”,lng)).Script(“doc[\u0027坐标\u0027].arcdestancewithdefault(lat,lon,-1)”)
    .查询(
    q1=>
    q1.过滤(
    f1=>
    f1.查询(q2=>q2.MultiMatch(mm=>mm.OnFields)(MultiMatchFields)
    .Query(关键字)
    .Type(TextQueryType.MostFields)))
    .Filter(f2=>f2.地理距离(“坐标”,gf=>gf.距离(10,地理单位.公里)
    .地点(拉丁美洲,液化天然气()()()));
    
    谢谢您的回答。在跟踪中,我可以看到值已填充。不幸的是,我在模型中定义的属性没有设置。您是否在映射中进行了进一步的配置?
    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))))));