我可以使用一些输入来开发以下搜索脚本的最佳方式:
如果用户搜索某个(或多个)关键字,则脚本首先必须检查这些标记是否存在完全匹配(其中wiki优先于博客)。这些匹配应首先显示在结果中。
然后它必须检查标题上是否匹配(wiki再次优先于博客,博客优先于文章等)。最后一步是检查表格内容的相关性。
目前我们只是对表格进行全文搜索,并对标题赋予优先级因素,但这并未考虑1)标记的优先级2)wiki优先于博客文章(等等)
有解决这个问题的有效方法吗?
答案 0 :(得分:1)
从头顶开始,有几个起点:
最简单的解决方案是进行大量查询(匹配wiki标签,然后匹配博客标签,然后匹配wiki标题,然后匹配博客标题,......)但这可能不会很高效。
根据您的表结构,您可以通过使用UNION
语句将所有内容混合到单个查询并对其进行排序来加快速度,但我认为这在代码中看起来非常糟糕。
如果你想要的只是一个全字匹配(所以“和”匹配“在这里和那里”而不是“在我手中”)你也可以建立自己的搜索索引。
以最简单的形式,这将是另一个表,例如,那些列:
现在,每当添加新内容时,您都必须对其进行剖析并使用它提供搜索索引。您可以将标题和内容拆分为单个单词,并将每个作为新行添加到搜索索引表中(分别为匹配类型= 1或2),并添加每个标记(作为匹配类型= 0)。更新内容也是如此,只需先删除旧的搜索索引条目。对于初始构建,如果出现问题,您还应该有一个“完全重建搜索索引”例程。
您的搜索引擎现在只需使用新的搜索表,该搜索表应该相当有效。您还可以通过将此表设置为内存表,使用其他数据库引擎或您提出的任何内容来进行进一步的优化。
根据您的要求,您还可以查看Apache Lucene,这是一个很棒的搜索库,它有自己的查询语言,即使对于庞大的数据集也非常快。
还有这个(ZendSearch)的PHP实现,但是当我不久前尝试它时,它对我来说还不够快。
在我的上一个项目中,我使用了Lucene和Apache Solr,它是Lucene的REST前端。我让它在只监听127.0.0.1的Tomcat服务器上运行。使用Solr服务器有一个PECL扩展:http://pecl.php.net/package/solr
当然,这需要设置很多(需要一个完整的Java环境,一个占用内存的应用程序服务器和一个PHP扩展),还需要学习很多东西,但它是一个非常强大的解决方案,可以扩展最佳。< / p>
答案 1 :(得分:0)
你不知道这是什么类型的应用程序。
如果它是一个Web应用程序,异步地向服务器发送不同的查询可能是一个简单的解决方案。首先发送最重要的查询,它们很可能也是最快的查询。数据恢复时更新显示的结果。
缺点是您将拥有重叠的结果集。按ID过滤不是问题,但服务器发回的数据过多。只有你能说出(不)重要的是什么。