大家应该都知道,使用sphinx或coreseek来做搜索时,除了sphinx2.0开始支持‘实时索引’外,我们使用增量索引时,出现的问题往往是删除后的数据展示问题的了。(新增的话,可以使用增量索引实现近乎实时的功能)。
当我们删除数据时,sphinx需要等到更新索引文件时,才会更新。而我们的索引文件不可能实时更新的。所以就造成搜索出来的数据经常不存在的了。解决这个问题,除了实时索引外,其实我们还可以利用一个小技巧就可以实现:
方法一:
当我们删除数据时,sphinx需要等到更新索引文件时,才会更新。而我们的索引文件不可能实时更新的。所以就造成搜索出来的数据经常不存在的了。解决这个问题,除了实时索引外,其实我们还可以利用一个小技巧就可以实现:
方法一:
具体就是:建立数据表的时候就多一个字段,字段名为deleted
当php操作删除数据的时候,同时对索引进行更新,使用UpdateAttributes
然后当你查询的时候设置过滤SetFilter,将deleted为1的排除就可以了
当然,上面只是一个方法
方法二:
不改变搜索实体的情况下,我们可以利用UpdateAttributes来把某个筛选项弄成永远不可能在正常范围之内的值。这样也可以起到删除临时数据的方法的了。
注意:以上二种方法,使用UpdateAttributes只是在内存中删除的了。如果想要把这个修改的更新到索引文件中去,还必须得重启服务或重建索引时。
以下为UpdateAttributes接口方法的使用方法:
当然,上面只是一个方法
方法二:
不改变搜索实体的情况下,我们可以利用UpdateAttributes来把某个筛选项弄成永远不可能在正常范围之内的值。这样也可以起到删除临时数据的方法的了。
注意:以上二种方法,使用UpdateAttributes只是在内存中删除的了。如果想要把这个修改的更新到索引文件中去,还必须得重启服务或重建索引时。
以下为UpdateAttributes接口方法的使用方法:
原型: function UpdateAttributes ( $index, $attrs, $values )
立即更新指定文档的指定属性值。成功则返回实际被更新的文档数目(0或更多),失败则返回-1。
$index 为待更新的(一个或多个)索引名。$attrs为属性名字符串的数组,其所列的属性会被更新。$attrs为hash表,$values表的键为文档ID,$values表的值为新的属性值的简单数组。
$index 既可以是一个单独的索引名,也可以是一个索引名的列表,就像Query()的参数。与Query()不同的是不允许通配符,全部待更新的索引必须明确指出。索引名列表可以包含分布式索引。对分布式索引,更新会同步到全部代理上。
只有在docinfo=extern这个存储策略下才可以运行更新。更新非常快,因为操作完全在内存中进行,但它们也可以变成持久的,更新会在searchd干净关闭时(收到SIGTERM信号时)被写入磁盘。在额外限制条件下,MVA属性也可以被更新,参见mva_updates_pool详细了解。
UpdateAttributes使用示例:
$cl->UpdateAttributes ( "test1", array("group_id"), array(1=>array(456)) );
$cl->UpdateAttributes ( "products", array ( "price", "amount_in_stock" ),
array ( 1001=>array(123,5), 1002=>array(37,11), 1003=>(25,129) ) );
第一条示例语句会更新索引“test1”中的文档1,设置“group_id”为456.第二条示例语句则更新索引“products”中的文档1001,1002和1003。文档1001的“price”会被更新为123,“amount_in_stock”会被更新为5;文档1002,“price”变为37而“amount_in_storage”变为11,等等。