在多个段落中搜索多个单词短语(PHP / MySQL)

时间:2013-12-21 07:12:46

标签: php mysql sql search

问题的前提:

我有一张表(我们称之为已提交的表),其中包含(以及其他相关数据) text 字段,名为 para 其中包含用户提交的段落。

这些段落有时包含多字词短语,可能包含在另一个表格的字段中(我们称之为表格),称为名称

两张桌子都很大。 已提交表格超过 400,000行 表格超过 1,400,000行< / EM>


问题:

我想浏览所有字段,如果任何段落中出现表中的任何短语(可以是&gt; = 1个字),请链接表中名称 ID的特定短语。

复杂的是,名称字段中的字数不固定,不同的名称字段值可以以相同的单词开头(例如Tom克兰西和汤姆克兰西的彩虹六是两个不同的条目)。 此外,该短语可以在任何地方和字段中出现,而一个可以匹配多个名称


一个例子

如果有一个段落:

  

我玩了很多游戏,到目前为止我最喜欢的游戏是Tom Clancy的Rainbow Six。

另一个问题是:

  

该系列中最好的是最初的汤姆克兰西和汤姆克兰西的彩虹六流氓矛。

如果表格如下:

╔═════╦══════════════════════════════════════╗
║ ID  ║                 name                 ║
╠═════╬══════════════════════════════════════╣
║ 101 ║ Tom Harding                          ║
║ 102 ║ Tom Clancy's                         ║
║ 103 ║ Tom Clancy's Rainbow Six             ║
║ 104 ║ Tom Clancy's Rainbow Six Rogue Spear ║
╚═════╩══════════════════════════════════════╝

然后我希望结果看起来像:

  

I've played many games and the best one I've liked so far is <a href="www.example.com/name/103">Tom Clancy's Rainbow Six</a>.

  

The best in the series are the original <a href="www.example.com/name/102">Tom Clancy's</a> and the <a href="www.example.com/name/104">Tom Clancy's Rainbow Six Rogue Spear</a>.


解决这个问题的最佳方法是什么?我不应该通过加入来做到这一点,对吧?

非常感谢您的投入!

1 个答案:

答案 0 :(得分:0)

有一些疯狂的长查询,如果你的submitted表有一个id,在我的例子中,我给它一个名为sid的列 这是SQLFiddle

查询的作用是加入values按sid,长度(名称)DESC排序,因为你想先替换最长的名字,但不是立即替换我用[103]或[替换它] 104](值中的名称id),因此一旦被替换,较短的名称(部分匹配)将找不到我们想要的另一个匹配。然后我用html链接替换这些[103],[104]值。 这是两次应用的相同方法。 该方法会沿途生成一些ID,以跟踪我们想要返回的行,该行始终是某个sid的最后一行,因为此时所有匹配都已正确替换。