【问题标题】:php mysql search fulltextphp mysql 搜索全文
【发布时间】:2011-12-07 00:39:29
【问题描述】:

表结构:

Companies: id, name, city, branch, keywords, country

keywords 字段包含名称 city 和 branch 一起,我现在只使用带通配符的 LIKE 例如 '%music london%' 将返回 'musicfactory london'

但它不够精确,例如,如果用户想要搜索伦敦的 Vini & Magraine(一家餐厅)并且输入是“vini londen”,但没有找到,但是如果用户插入“magraine london”,它会被发现。

所以问题可能是关键字的顺序,现在我打算转换为全文搜索,我已经在关键字字段上创建了索引,关键字字段也是一个聪明的主意吗?

我的主要问题是,我用这个查询创建了一个全文搜索:

SELECT id, name, branch FROM companies WHERE MATCH(keywords) AGAINST(? IN BOOLEAN MODE) AND country = ? LIMIT 7

但是它没有返回正确的结果?什么是最好的和最有效的解决方案?

感谢阅读。

【问题讨论】:

    标签: php mysql full-text-search


    【解决方案1】:

    这是针对运营商的标准匹配的一个很好的细分。它应该阐明如何编写查询:

    http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

    如果我正确阅读了您的问题,您是在询问公司表中的“关键字”列是否是个好主意 - 我说这取决于您如何填充它,但可以肯定的是,这还不错。我使用了一个集合关键字列,其中包含之前相关字段集合中的所有标准文本,并且效果很好。

    还有一些注意事项 -

    1)我认为您的 LIKE 示例存在缺陷,根据该规则,我很惊讶您得到了任何结果。 % 是一个具有方向性的通配符。所以 '%music london%' 不应该返回 'musicfactory london'。您需要将其写为 WHERE(keywords LIKE '%music%' AND keywords LIKE '%london%') 才能正常工作。

    2) 全文搜索只能在 MyISAM 表上使用,因此如果您使用依赖于 innoDB 的框架,您将需要创建一个关系解决方法。 (或任何其他使用 innoDB 的原因)

    3) match against 的默认最小字符数默认为 4。您需要在配置中将其设置得较低,如果您需要较低的最小字符范围,则重新构建全文索引。考虑像“艺术”这样的词,你就会知道为什么建议降低这个值。否则,您可能必须编写一个条件来在匹配和 LIKE 模式之间切换较短的字符串。

    【讨论】:

    • 你能仔细检查你在这里所说的话:你的数据库是 innoDB 吗?如果是这样,匹配对您不起作用,您将需要考虑一种解决方法。你能验证吗?除此之外,您可以根据自己定义的一组运算符构建查询字符串。使用正则表达式,您可以轻松识别搜索词中的某些内容,例如引号或逗号等。然后使用它来决定您是否需要(+,-等)来修改与词的匹配。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 2015-07-03
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多