从mysql或sphinx生成排名关键字(基于频率)

时间:2014-06-22 12:51:09

标签: php mysql sphinx keyword

我刚刚在sphinx搜索中遇到indexer --buildstopwords dict.txt 100000 ....功能,该功能会创建一个包含指定索引中最常用术语的停用词文件。以下是我的一个索引的输出示例:

bedroom 974428
sale 888884
for 884699
house 515221
delivery 464002
day 462239
same 406905
5dr 364648

但是,我不想为整个数据库执行此操作,而是要为各个类别生成列表。使用sphinx索引器似乎无法做到的事情。

我是否可以通过其他方式从mysql中的title字段生成关键字列表,并将结果作为有序列表返回排名?

任何答案的一个可能问题是我的mysql中的title表没有编入索引(因为sphinx负责我的搜索)并且我有超过10米的记录。

1 个答案:

答案 0 :(得分:1)

正如“全部”sphinx对buildstops函数所做的那样,运行索引查询'sql_query',并将结果拆分为单词(按照正常的标记化规则)并计算freqeuencs。

因此无论索引与否都无关紧要,您只需要检索所有行。

......这样的功能相对容易复制自己。运行查询以获取所有标题,拆分为单词并对结果求和。


但可能你可能会像sphinx一样努力使它变得有效(因为这是一个编译的C程序,通常是非常聪明的开发人员;)。但是,如果您可以将其作为隔夜批处理程序运行,那么您的版本的速度和笨重程度可能并不重要。


如果效率很重要,可以创建一个可以使用的假狮身人面像指数(即它永远不会被索引),

例如,创建一个包含一行的特殊表 - category_id。并且索引使用它来过滤结果(表只是将'变量'传递给sphinx索引的一种hacky方式)

sql_query = SELECT id, title FROM table INNER JOIN sphinx_category USING (category_id)

然后是一个小脚本

<?php 
$cats = getCol("SELECT category_id FROM categories");
foreach ($cats as $cat) {
  query("UPDATE sphinx_category SET category_id = $cat");
  `indexer --buildstops filtered_index > words$cat.txt`;
}