【问题标题】:best keyword searching technique最佳关键字搜索技术
【发布时间】:2015-07-13 14:19:17
【问题描述】:

我有一个表,其中包含一个名为 title 的列。

输入以字符串的形式从用户那里获取。字符串实际上是一组以空格分隔的关键字。

我想搜索整个表,查找标题字段包含用户输入的字符串中存在的一些关键字的记录,结果需要按匹配顺序显示。

例如:

RecordA -> title -> "apple mango grapes banana"
RecordB -> title -> "apple lemon orange"
RecordC -> title -> "banana"
RecordD -> title -> "lemon mango grapes"

假设用户输入的字符串是:“apple mango orange” 然后我要按顺序从php页面得到结果

Record A  // 2 matches
Record B  // 2 matches
Record D  // 1 match
Record C  // 0 match

建议我在 php 中执行此操作的有效方法..

注意:数据库在 Mysql 中。无法修改为表格添加全文搜索索引。

【问题讨论】:

  • 使用数据库可能会很慢,因为您必须请求所有表,并在 PHP 中自行解析。如果你要使用大量数据,你应该使用 SolR,它就是为做这种事情而设计的......
  • 这取决于您的数据集,您的数据大小是多少? 10、100、1 000、10 000、1 000 000 行... ?在单词上,每行有多少个单词? 1-5, 1-20... ?
  • 目前已经超过 100 万行,并且还在扩展中......
  • 对不起.. 1000000(100 万)
  • 100 万行有点小,我猜你不会想与其他系统集成,所以慢慢来

标签: php mysql keyword


【解决方案1】:

最好的方法是全文搜索(见here)。这做你想做的事情的正确方法,而且它是迄今为止最有效的。

在没有全文搜索的情况下你可以做的事情是这样的:

select t.*
from table t
where title like '%word1%' or
      title like '%word2%' or
      . . .
order by ((title like '%word1%') +
          (title like '%word2%') +
          . . .
         ) desc;

您必须解析用户提供的单词以获取每个单词。另请注意,您的单词边界有问题。如上所述,这将找到任何出现的字母串,即使在一个单词中也是如此。如果这是一个问题,请使用正则表达式而不是 like。但是,真正的解决方案是全文搜索。

【讨论】:

  • 1 000 000 行的性能如何?
  • 那个+号是什么意思??
  • @user2653926 他计算你的分数,看看实际行中有多少匹配的单词
  • @Random 。 . .这将需要全表扫描。我认为答案很明确,全文搜索是要走的路。
  • 这是一条路,是的,但据我所知,在数据库上使用LIKE 是时间贪婪的,所以多个LIKE 可能需要很多时间。我从来没有使用过这样的全文搜索,所以我想知道 1 000 000 行需要多少时间...... 10 秒、2 分钟、30 分钟......?
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2013-09-13
  • 2011-01-12
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多