【问题标题】:Basic site-wide search methodology?基本的全站搜索方法?
【发布时间】:2012-06-28 13:26:06
【问题描述】:

我想为所有内容(或至少可搜索的内容)都存储在数据库中的网站构建站点范围的搜索。在不过度参与的情况下,我能想到的最佳方法如下:

  1. 用户输入搜索查询 - “棕色真皮沙发”。
  2. 将查询拆分为数组。
  3. 对数组的每一行使用 LIKE %$val% 搜索数据库 (mysql)。
  4. 将结果加载到数组中,然后为每个结果在内容中找到的搜索字词数量加 1 分。
  5. 如果结果中包含匹配数量的字词,则按特定页面的查看次数排序 - 一个受欢迎程度的指标。

使用页面标题中的搜索词为结果赋予更多价值,或允许用户使用引号搜索多词短语等操作并不会太复杂。

除了性能方面的考虑 - 限制返回的结果、缓存等,还有什么我需要考虑的或更好的方法来解决这个问题(除了实现 Google 搜索框)?

【问题讨论】:

  • 您是否查看过搜索服务器,例如Sphinx

标签: mysql search methodology


【解决方案1】:

不确定过度参与的门槛是多少,但我可能会先搜索包含整个字符串数组的匹配项,然后调用您描述的方法。

考虑:将作为单独结果返回的两条内容。

结果 1:

____ brown ____ ____ _____ ____ brown ____ ____ ______ ___ brown _____ ____ brown

结果 2:

brown leather sofas _____ _____ ______ ____ _____.

显然我们希望将结果 2 作为最高结果返回,但是您的方法会为结果 1 分配更多“点”。

【讨论】:

  • 很好的观察,谢谢。肯定会更加重视与短语完全匹配的实例,然后是那些术语最接近的实例等。老实说,这可能是一个非常有趣的练习。 :)
【解决方案2】:

你考虑过Full Text Searching吗?它并不适用于所有情况,但可以帮助解决此类问题。

SELECT * 
FROM articles
WHERE MATCH (title, body)
AGAINST ('database' IN NATURAL LANGUAGE MODE);

请务必阅读docs,因为有一些有趣的陷阱可以吸引新用户,例如:

如果您创建一个表格并仅在其中插入一两行文本,则文本中的每个单词至少出现在 50% 的行中。因此,没有搜索返回任何结果。确保插入至少三行,最好更多。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多