在狮身人面像上按道路(不是地理)上城市到城市的距离对文档进行排序
sorting documents by distance from city to city on the roads (not geo) on the sphinx
我有一个有趣的问题。
鉴于:
- "My city"
- 文件清单
- 城市列表和它们之间的距离
我需要按文档与我所在城市的距离升序对文档进行排序。
例如:
- 我在X市
- 我在以下城市附近:
城市 A - 50,城市 B - 350,城市 C - 10,城市 D - 321
我有文档:Doc1 - CityA、Doc2 - CityD、Doc3 - CityB、Doc4 - CityX、Doc5 - CityC
我需要在下一次排序中获取文档:
文件 5,
文件1,
文档2,
Doc3
本来我是打算这样解决问题的:
创建一个分类器
if (cityid = 945,5, if (cityid = 2050,4, if (cityid = 652,3, if (cityid = 2654,2, if (cityid = 734,1,0)))) ) 作为 sorter_cityid0
然后排序。
看起来都不错。
但是到了真正的问题上,嵌套条件变得很大,出现了错误
解析器堆栈溢出 NEAR
OK,尽量不要破坏几个排序器:
if (cityid = 945,5, if (cityid = 2050,4, if (cityid = 652,3, if (cityid = 2654,2, if (cityid = 734,1, 0))))) as sorter_cityid0, if (cityid = 4372,5, if (cityid = 1123,4, if (cityid = 2657,3, if (cityid = 2655,2, if (cityid = 2052 ,1,0))))) as sorter_cityid1, if ( cityid = 790,5, if (cityid = 4373,4, if (cityid = 663,3, if (cityid = 475,2, if ( cityid = 2651,1,0))))) as sorter_cityid2, if (cityid = 403,5, if (cityid = 1200,4, if (cityid = 855,3, if (cityid = 2669,2 , 如果 (cityid = 785,1,0))))) 作为 sorter_cityid3 ....
但是接下来有一个新的限制
排序依据属性太多;最大计数为 5
在示例中,我没有指定完整嵌入
而问题是:你遇到过这个问题吗,如何解决的?
分别考虑每个城市,分页时考虑城市是什么并计算我必须在页面上显示的城市?
例如:第1页-1.2的城市
第 25 页 -
我认为那是在第一页上,有多少文件,如果你 运行 出城 - 去下一个城镇,等等,直到我们到达我们的页面 ...
P.S.
地理搜索不适合,因为道路上使用的是距离,而不是坐标
如果您使用的是 SphinxAPI(而不是 SphinxQL),建议使用 SetOverride
方法。这能够处理长列表。
对于 SphinxQL,有 REMAP()
函数
http://sphinxsearch.com/docs/current.html#misc-functions
但我不知道它能处理多少个值。
最 'scalable' 的解决方案,可能是将数据重新格式化为 JSON 属性,然后可以直接对其进行排序。但这可能需要一些大量的编码。
如果城市数量较少and/or固定,可以添加一列作为当前文档到其他城市的预计算距离。然后在排序时 select 正确的列。
我有一个有趣的问题。
鉴于:
- "My city"
- 文件清单
- 城市列表和它们之间的距离
我需要按文档与我所在城市的距离升序对文档进行排序。
例如:
- 我在X市
- 我在以下城市附近: 城市 A - 50,城市 B - 350,城市 C - 10,城市 D - 321
我有文档:Doc1 - CityA、Doc2 - CityD、Doc3 - CityB、Doc4 - CityX、Doc5 - CityC
我需要在下一次排序中获取文档:
文件 5, 文件1, 文档2, Doc3
本来我是打算这样解决问题的:
创建一个分类器 if (cityid = 945,5, if (cityid = 2050,4, if (cityid = 652,3, if (cityid = 2654,2, if (cityid = 734,1,0)))) ) 作为 sorter_cityid0
然后排序。
看起来都不错。
但是到了真正的问题上,嵌套条件变得很大,出现了错误
解析器堆栈溢出 NEAR
OK,尽量不要破坏几个排序器:
if (cityid = 945,5, if (cityid = 2050,4, if (cityid = 652,3, if (cityid = 2654,2, if (cityid = 734,1, 0))))) as sorter_cityid0, if (cityid = 4372,5, if (cityid = 1123,4, if (cityid = 2657,3, if (cityid = 2655,2, if (cityid = 2052 ,1,0))))) as sorter_cityid1, if ( cityid = 790,5, if (cityid = 4373,4, if (cityid = 663,3, if (cityid = 475,2, if ( cityid = 2651,1,0))))) as sorter_cityid2, if (cityid = 403,5, if (cityid = 1200,4, if (cityid = 855,3, if (cityid = 2669,2 , 如果 (cityid = 785,1,0))))) 作为 sorter_cityid3 ....
但是接下来有一个新的限制
排序依据属性太多;最大计数为 5
在示例中,我没有指定完整嵌入
而问题是:你遇到过这个问题吗,如何解决的?
分别考虑每个城市,分页时考虑城市是什么并计算我必须在页面上显示的城市?
例如:第1页-1.2的城市
第 25 页 - 我认为那是在第一页上,有多少文件,如果你 运行 出城 - 去下一个城镇,等等,直到我们到达我们的页面 ...
P.S.
地理搜索不适合,因为道路上使用的是距离,而不是坐标
如果您使用的是 SphinxAPI(而不是 SphinxQL),建议使用 SetOverride
方法。这能够处理长列表。
对于 SphinxQL,有 REMAP()
函数
http://sphinxsearch.com/docs/current.html#misc-functions
但我不知道它能处理多少个值。
最 'scalable' 的解决方案,可能是将数据重新格式化为 JSON 属性,然后可以直接对其进行排序。但这可能需要一些大量的编码。
如果城市数量较少and/or固定,可以添加一列作为当前文档到其他城市的预计算距离。然后在排序时 select 正确的列。