Sorting 按斯芬克斯上道路(非地理位置)上城市之间的距离对文档进行排序

Sorting 按斯芬克斯上道路(非地理位置)上城市之间的距离对文档进行排序,sorting,sphinx,Sorting,Sphinx,我有一个有趣的问题 鉴于: “我的城市” 文件清单 城市列表以及它们之间的距离 我需要按文件与我所在城市的距离按升序排序 例如: 我在cityX 我在以下城市周围有: 城市-50、城市B-350、城市Y-10、城市YD-321 我有文档:Doc1-CityA,Doc2-CityD,Doc3-CityB,Doc4-CityX,Doc5-CityC 我需要在下一次排序中获取文档: 文件5, 文件1, 文件2, 文件3 最初我打算按如下方式解决这个问题: 创建一个分拣机 作为分拣机的if(ci

我有一个有趣的问题

鉴于:

  • “我的城市”
  • 文件清单
  • 城市列表以及它们之间的距离
我需要按文件与我所在城市的距离按升序排序

例如:

  • 我在cityX
  • 我在以下城市周围有: 城市-50、城市B-350、城市Y-10、城市YD-321
我有文档:Doc1-CityA,Doc2-CityD,Doc3-CityB,Doc4-CityX,Doc5-CityC

我需要在下一次排序中获取文档:

文件5, 文件1, 文件2, 文件3

最初我打算按如下方式解决这个问题:

创建一个分拣机 作为分拣机的if(cityid=945,5,if(cityid=2050,4,if(cityid=652,3,if(cityid=2654,2,if(cityid=734,1,0)cityid0

然后分类

看起来一切都很好

但当涉及到实际问题时,嵌套条件变得非常大,并且存在错误

附近的解析器堆栈溢出

好的,尽量不要弄坏一些分拣机:

if(cityid=945,5,if(cityid=2050,4,if)(cityid=652,3,if(cityid=2654,2,if(cityid=734,1,0)作为分拣机,if(cityid=4372,5,if)(cityid=1123,4,if(cityid=2657,3,if)(cityid=2655,2,if(cityid=2052,1,0ɕ)作为分拣机(cityid=2651,1,0(()()(cityid=403,5,if(cityid=1200,4,if(cityid=855,3,if(cityid=2669,2,if(cityid=785,1,0))))作为分拣机(

但还有一个新的限制

按属性排序太多;最大计数为5

在示例中,我没有指定完全嵌入

问题是:你遇到过这个问题吗?如何解决

[P>分别考虑每个城市,当分页考虑城市是什么,计算出我在页面上显示什么城市?

例如:第1页-1.2人的城市

第25页- 我想那是在第一页,有多少文件,如果你离开了城市-去下一个城镇,所以,直到我们到达我们的页面

附言


地理搜索不适用,因为距离是在道路上使用的,而不是坐标

如果您使用的是SphinxAPI(而不是SphinxQL),则建议使用
设置覆盖
方法。该方法能够处理长列表

对于SphinxQL,有
REMAP()
函数 但我不知道它能应付多少价值观


最具“可伸缩性”的解决方案可能是将数据重新格式化为JSON属性,然后可以直接对其进行排序。但这可能需要大量的编码。

如果城市数量较小和/或固定,您可以为当前文档到其他城市的预计算距离添加一列。然后只需选择排序时请选择正确的列。

谢谢,我尝试了2.1.9版,但出现了“某些问题”,最后一个问题是“一切正常”。显然,问题出在客户端,我将进一步探讨这一点。如果有兴趣,错误是“按属性排序,而不是按基金”和“外出时未知属性名称”虽然对2.2.7的相同请求非常成功,但我今天或明天会尝试!但是这样一个时刻:该方法将值作为docId newValue。但是我不知道我需要更改哪个docId=),看起来我需要获取最大数量的文档,然后对它们进行排序?但是斯芬克斯不再需要了:)我不认为重新映射功能仅限于处理DocID。否则建议使用JSON属性解决方案。是的,重新映射是件好事。我会在现实生活中尝试。但是我需要将sphinx从2.1.9更新到edge(现在编码有问题:()您是否尝试使用sphinxAPI的重新映射(SetSelect)?我有错误选择:语法错误,意外的,,,,,接近的,2050652),(0,1,2))作为rmp1(SetSelect是:*,重新映射(cityid,sorter,(94520505052),(0,1,2))作为rmp1)。奇怪,因为重新映射(cityid,sorter,(0),(0))作为rmp1工作。