千万级内链系统架构(下)

2018-04-08
  • 1243
  • 0

前面2个文章,其实已经讲完了,怎么匹配内链的问题。但是还有一部份更技术化的内容并没有涉及。本文来详细讨论讨论。

 

前文讨论的问题,有几个前提,并没有说明清楚。

 

一、 文章需清理。

什么 是文章需清理。大家想一下,假如文章里面我添加了一个图片,图片链接里面有中文,直接使用内链,可能会把图片链接里面的中文拿去分词处理,实际上我们是不需要的。我们需要的是对纯文本内容进行分词处理。

 

所以,在分词前,需要有一步,清理所有HTML标签。非常重要。

 

二、替换不简单

假如一篇800字的文章讲SEO工具相关的一篇文章,我们已经用前面的方法匹配出来,SEO优化、SEO优化工具、SEO优化工具好不好,这3个词需要做内链。

 

是不是直接拿这3个词,把文章里面的SEO优化,替换成<a href=内链链接 target=_blank>SEO优化</a>就完事了。如果只是这样,我只能说Too young,to naïve。现在所有后台涉及文本编辑的地方,可都不是纯文本。那是富文本编辑器。比如下面这个:

blob.png 

这并不是真实的源代码。页面的源代码是带标签的:

blob.png 

 

我们在匹配的那步是清理完所有标签去匹配关键词的。这是没有问题的。但是匹配出来的词,我们要往HTML内容里面加链接就会遇到相当多的问题了。

 

Img和Alt标签为例。假如代码是下面这样的

<img src=logo.jpgalt=SEO优化“ /> 我们需要的是文章里面的关键词加上链接。如果直接加上链接,这段代码会变成<img src=logo.jpgalt=<a href=link target=_blank> SEO优化</a>“ />标签里面再嵌入了一层标签,这种做法显示是错的。到时候页面会出现大量的乱码。

 

解决方案当然是有的,经过大量的测试。我们只需要在添加内链之前,做一个处理就行了。使用的当然是最无敌的正则表达式。我把这个方法叫做替换还原法。步骤如下:

Step1:设定一个不可见字符,比如这种。把文章中的这种字符清理掉(正常文章应该不会有这种内容)。

Step2:匹配所有Img标签。替换并记录到字典。这句话很费解的,大概意思就是把所有<img src=logo.jpgalt=SEO优化“ />,按顺序替换为1,第二条替换为2,以此类推,然后把关系写到Map里面一一对应,在Java里面是Map,在 C#里面是dictionary,在Python里面是dict,在PHP里面是数组。

结构会是这样的:

1  => <img src=logo.jpgalt=SEO优化“ />

2  => <img src=logo.jpg2alt=SEO优化2“ />

3  => <img src=logo.jpg3alt=SEO优化3“ />

为什么这样做呢,我需要把文章里面不能动的内容抽出来,但是抽出来之后,得还原回去,所以需要把抽出来的内容,做一个位置标记。像1这样的就是一个位置标记。

Step3:同样替换A标签,匹配时,使用正则可以快速匹配。并一个个替换掉。

Step4:现在的文章里面,应该已经没有img和A标签了,已经被替换成了1这样的内容。加上一些正常的文字了。现在可以遍历分词法得到的关键词和链接,开始插入链接了。

简单的办法是:根据位置记录下关键词,替换下来之后,同样使用1替换占位,把结果放到Map里面。

 

Step5:终于要成功了,现在需要做的就是遍历Map里面的数据还原回来。把所有1还原为Map里面的Value的内容。这篇文章就处理完成了。

 

此外的逻辑相当复杂,就不贴代码了。代码超过400行。

 

方法还算比较巧妙,但是目前为止,我也没见过更好的算法可以实现。

 

三、 收尾。

还有一些收尾工作,比如SEO优化只能加3次,加到之后,别的文章不再使用。

 

比如优先按最长的关键词加链接。在上面的Step4里面对关键词进行一轮排序,按长度从前往后排就行了。

 

比如记录每个页面的内网结果。需要保存之后,把页面ID和关键词内链表的ID关联起来保存下来即可。

 

结尾语:看似简单的关键词内链,其实是异常复杂的一套逻辑和架构。越是海量的内容,如果对SEO依赖非常高,对内链系统的建设来说,也是一套很挑战的技术。希望大家有所收获。