【问题标题】:Concise FULLTEXT Search简洁的全文搜索
【发布时间】:2012-09-04 12:05:12
【问题描述】:

我一直在尝试寻找有关使用 MySQL 的 FULLTEXT 搜索的帮助。我意识到这已经被讨论到死了,但我不太明白如何获得一组简洁的结果。

我有一个 MyISAM 表,其中包含 500,000 种产品,并在“product_name”表上设置了 FULLTEXT 索引。

一个基本的查询是:

SELECT * from products MATCH(product_name) AGAINST ("coffee table") AS relevance 
WHERE MATCH(product_name) AGAINST ("coffee table").

我得到了一份包含数百种与咖啡或餐桌相关的产品的清单。这不够具体,意味着有用的结果与太多其他项目混在一起。

我修改了我的查询,使用 MATCH 为每个结果提供相关性,然后使用 LIKE 执行实际查询。

SELECT * from products MATCH(product_name) AGAINST ("coffee table") AS relevance 
WHERE ((product_name like "%coffee%" AND product_name like "%table%") or product_name like "%coffee table%")

这个想法是我看到 Wordpress 如何执行搜索时得到的。在有人使用更具体的关键字进行搜索之前,这种方法效果很好。一个真实的例子是搜索“Nike blazer low premium v​​intage”。在这种情况下,没有结果(而第一个使用 MATCH 的方法返回数百个)

我知道我可以使用 IN BOOLEAN MODE,但许多用户不知道使用 +/- 运算符来更改他们的查询。我还没有弄清楚我应该如何使用 HAVING 子句来限制结果。

此外,由于这是共享主机,我无法更改默认的最小字长 - 这意味着缺少关键字,例如颜色“红色”或品牌名称“GAP”。

我已经阅读了一些关于创建关键字索引表的内容,但没有找到合适的参考。

有人可以提供一个解决方案,我可以使用产品搜索词(由 Joe Public 输入)来提供一组简洁的结果。谢谢

【问题讨论】:

  • 您想Nike blazer low premium vintage 回馈一些东西吗?另外,如果我理解正确,您希望匹配尽可能多的单词,而不考虑全文计算的内置相关性,对吧?
  • Mathieu - 感谢您的回复。我希望它返回结果,但不是每个关键字单独返回,因为它有太多。我还对 MATCH/relevance 执行 ORDER BY 并返回最佳结果。它生成的数字会随着我假设的关键字数量而变化?
  • 相关性不仅取决于关键字的数量,还取决于每个关键字的相关性:dev.mysql.com/doc/internals/en/full-text-search.html
  • 好的,我觉得没问题。我按相关性排序并返回最重要的结果——这就是我认为的搜索所需的全部内容。问题仍然是如何获得适量的结果 - 对于我的示例, MATCH 没有返回任何内容,而 LIKE 返回太多
  • 那么如果你不想使用默认行为,并且想匹配尽可能多的关键字,为什么不使用布尔搜索呢?默认运算符为OR,相关性将是匹配关键字的数量。

标签: mysql search full-text-search myisam


【解决方案1】:

我做了更多的研究,正如许多人所说,对于像搜索这样的“人类”来说,这不是一个好的解决方案——一个例子是它如何处理单词复数(汽车/汽车)。我查看了 Apache Lucene,但它超出了我的设置和配置能力。

目前,“解决方案”一直是坚持使用 IN BOOLEAN MODE(正如 Mathieu 也建议的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2021-10-24
    • 2019-10-17
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多