搜索(可能)成千上万个令牌的文本

时间:2009-04-30 15:22:40

标签: php

我正在维护一个简单的基于php的内部cms。我想搜索文章的文本,因为它们被保存到系统中,最终会有成千上万个不同的令牌,以便自动应用这些令牌的链接,并在关联表之间建立关系。文章和令牌代表的实体。

最好的方法是什么?有没有比每次保存文章时检索所有令牌及其相关实体/ id的列表更快/更有效的方法呢?

我对替换令牌的兴趣不如建立要搜索的令牌列表的最佳方式 - 它们将来自几个不同的表,我认为在每个请求的基础上数据集需要查询对于脚本的数据库和内存负载来说都是一个负担

编辑:我认为我错误地提出了这个问题。

考虑以下文字:

史蒂夫麦克马芬在The Stinking Bean吃了十七个神话般的毛茸茸的Fajitas,而Johnson Fatlumps吃了三十二个。

我有两个人在'人'桌上,一个在'餐厅'餐桌上的餐馆和一个餐馆菜单项在'restaurant_menu_item'表中。

我希望了解保存文字后的最佳方式,自动浏览并确定什么是人,什么是餐馆,以及什么是餐馆菜单项没有诉诸于自定义标记作为目标受众几乎没有机会做到这一点。

2 个答案:

答案 0 :(得分:1)

除非你能得到令牌格式的保证,否则这总是很困难(无论如何都是计算上的)。如果没有标记,计算机实际上并不知道任何特定字符串具有任何特殊含义,如果它不能被教导识别格式。

“简单”的答案是遍历每个令牌的文本,看看它是否存在,并处理它。但是你会遇到两个问题:计算时间和碰撞(正如Chad在评论中指出的那样)。

您是否可以执行非常简单的标记?如果短语被[[bracket]]包围,MediaWiki只会创建内部链接。如果你使用CamelCaseThePhrase,很多wiki软件只会建立链接。

我想不出一种方法可以让应用程序自动地知道某些字符组有意义,而无需检查每个已定义的标记或强制执行某种格式。

您确定您的受众群体无法处理类似

的内容
SteveMcMuffin ate seventeen FabulousFurryFajitas at
TheStinkingBean, while JohnsonFatlumps ate thirty-two.

[[Steve McMuffin]] ate seventeen [[Fabulous Furry Fajitas]] at
[[The Stinking Bean]], while [[Johnson Fatlumps]] ate thirty-two.

答案 1 :(得分:0)

我们有类似的情况。我们最终使用正则表达式来解析和替换令牌。因为原始文章是一个模板,我们会在替换标记的情况下生成新文章,所以我们会缓存生成的文章,因此对模板没有任何更改意味着没有新的解析。