gpt4 book ai didi

c# - Elasticsearch以不同的排序顺序获得距离

转载 作者:行者123 更新时间:2023-12-02 23:03:10 25 4
gpt4 key购买 nike

背景:

我们有以下要求:

  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显示了如何不使用sort来获取距离。

下面是与答案等效的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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com