问候, 我正在考虑在我的网站上实施搜索的最佳方式。我知道Sphinx和MySQL的全文搜索,但我不只是搜索单个字段。
我想要搜索两件事:文章标题和与该文章相关的标签。
我想要做的是在我的文章表中定义另一列,其中包含标题中的关键字,以及附加到此字符串末尾的每个标记。
例如,如果文章标题是“如何建立家庭影院”,并且标签为“DIY”,“技术”这个领域将是“建立家庭影院DIY技术”。然后我可以在这个领域进行搜索。
我看到这种方法的唯一缺点是,如果标签已更新,我将不得不更新此字段,这可能导致此字段不准确或过时。
有更好的方法吗?
答案 0 :(得分:1)
Sphinx可以根据多个列进行搜索。它甚至允许为每列定义“重量”。我认为你应该坚持下去。
答案 1 :(得分:0)
您可以在MyISAM中对MySQL的表的多个列进行全文搜索。
请参阅:
$search = 'how to do short circuit evaluation?';
$q = 'SELECT * FROM `table` WHERE MATCH(tags, title, description) AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
$r = mysql_query($q);
//.. so on
做另一个表需要不断的同步,这对你的系统来说非常繁琐。
由于您的代码处于多对多关系中,因此您可以获取它们并将其合并到查询中
$q = 'SELECT * FROM `table` WHERE'.
' MATCH(tags, title, '.
'(SELECT GROUP_CONCAT(`tag`) FROM `tags`'.
'WHERE `ArticleID`='.(int)$ArticleID.')'.
') AGAINST ('.mysql_real_escape_string($search).' IN BOOLEAN MODE)';
答案 2 :(得分:0)
在Sphinx中使用多值属性作为标记:
MVAs或多值属性是Sphinx中一种重要的特殊类型的每文档属性。 MVA可以将值列表附加到每个文档。它们对文章标签,产品类别等非常有用。支持对MVA属性进行过滤和分组(但不是排序)。
答案 3 :(得分:0)
Sphinx,Lucene以及几乎所有的全文搜索不仅限于单个字段。实际上,默认设置是搜索所有字段,然后过滤指定的字段。我认为内部MySQL搜索不是很好,Sphinx和Lucene插件要好得多。