我有一个新网站,列出了大量产品,使用 php 构建并使用 mysql 数据库。
我们需要像其他大型网站一样进行搜索,例如,在搜索“山地自行车”时选择标题中带有“山地自行车”的产品 - 仅在搜索输入的术语时使用 LIKE 不会这样做。我在一个较小的站点上使用了 AGAINST 匹配,该站点在那里运行良好,但是由于每个单词都是单独搜索的,在这种情况下,由于数据库中的数量,它可能会带来大量不相关的产品。
任何人都可以帮忙看看在网站上搜索的最佳方法是什么?
MySQL 的全文布尔搜索支持您想要搜索与所有单词匹配的文本的情况,就像您在它们之间使用布尔 AND一样:
WHERE MATCH(product_description) AGAINST ('+mountain +bikes' IN BOOLEAN MODE)
但这仅搜索包含两个单词的文本,单词“bikes”可能出现在“mountain”之前,或者这两个单词可能被其他文本分隔。
找到行子集后,您可以使用未优化的谓词进一步细化它以搜索确切的短语。您可以希望“误报”不会导致过多的额外工作。
WHERE MATCH(product_description) AGAINST ('+mountain +bikes' IN BOOLEAN MODE)
AND product_description LIKE '%mountain bikes%'
您还可以使用其他更灵活的文本搜索工具,这些工具能够搜索短语(以及 MySQL 全文搜索所缺乏的许多其他功能)。
在我的演示文稿中查看我的比较Full Text Search Throwdown。
这里的困难在于一个人的“完全不相关”可能是另一个人的“非常相关”。
我建议您使用 MySQLMATCH...AGAINST
并按ORDER BY
降序对结果进行排序。使用WHERE
子句确保只显示匹配返回结果 > 0 的结果。这样,您将消除最不相关的产品(MATCH...AGAINST
返回 0 的产品),但仍会显示甚至有些相关的产品。
If your site is well-managed in Google Webmaster tools and is already indexed, you can use a Google Custom Search Engine (CSE).
I've found that using one of these actually improves your indexed results because you catch seo issues while getting the search to work.
I would not recommend this as an overnight solution, but with a month or two of using it internally, could be your best bet.