我刚刚在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米的记录。
答案 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`;
}