Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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
Ruby on rails 思考Sphinx-在进行更改时,按字符串属性排序会失去同步_Ruby On Rails_Ruby_Sphinx_Thinking Sphinx - Fatal编程技术网

Ruby on rails 思考Sphinx-在进行更改时,按字符串属性排序会失去同步

Ruby on rails 思考Sphinx-在进行更改时,按字符串属性排序会失去同步,ruby-on-rails,ruby,sphinx,thinking-sphinx,Ruby On Rails,Ruby,Sphinx,Thinking Sphinx,我有一张带“姓名”栏的“餐馆”桌子。我定义了以下索引: indexes "REPLACE(UPPER(restaurants.name), 'THE ', '')", :as => :restaurant_name, :sortable => true 。。。因为我想对餐厅名称进行排序,而不考虑前缀“the” 我的问题是,每当更新其中一条记录时(以任何方式),新记录就会跳到排序顺序的顶部。如果更新了另一条记录,它也会跳到其他记录之前。最后我列出了两个列表:一个是自上次重新编制索引以

我有一张带“姓名”栏的“餐馆”桌子。我定义了以下索引:

indexes "REPLACE(UPPER(restaurants.name), 'THE ', '')", :as => :restaurant_name, :sortable => true
。。。因为我想对餐厅名称进行排序,而不考虑前缀“the”


我的问题是,每当更新其中一条记录时(以任何方式),新记录就会跳到排序顺序的顶部。如果更新了另一条记录,它也会跳到其他记录之前。最后我列出了两个列表:一个是自上次重新编制索引以来已更新的餐厅列表,另一个是尚未更新的餐厅列表。每个列表都是按字母顺序排列的,但我不明白为什么整个列表会以这种方式分开。我确实设置了一个延迟的delta索引,我假设这个问题与此相关。

不幸的是,这是sphinx的一个限制


要按字符串排序,它将构建一个有序的值列表,然后将它们转换为表示列表中位置的整数。这是在每个索引的基础上发生的,因此,当第一项添加到增量索引时,您将得到2条以1排序的记录。下一条记录意味着您将有2条记录使用2等进行排序。

我通过创建自己的排序方法来处理这一问题。可以基于字符串的某些部分创建整数值。我采用了一种廉价的方法,只使用第一个字符的char值。通过创建转换短语中更多字符的算法,您可能会变得更复杂。当我使用另一个搜索引擎进行搜索时,我们使用了6个字符,但很少出现顺序错误,这就是我们的整个顺序方法。如果您这样做并在之前将其作为次要订单,那么它将有助于解决您的Delta问题。

好的。在这种情况下,我认为最好删除delta索引。我设置了一个cron作业,每小时运行thinking_sphinx:index函数。这听起来像是正确的方法吗?只要你对新记录和更新在一个小时内不会出现在搜索结果中感到满意,这种方法就行了