内链是一个比较复杂的架构,很难在几篇文章内详尽的描述清楚。所以有了第二篇文章。具体的讲解一下,如何实现千万级的内链架构。
现代化的内链系统建设,如何来实现千万级数据的处理呢。
这里也有2种方式可以实现。方案二未测试,实际上应该是无问题的。
千万级内链系统架构方案一:分词技术。
核心的内容点就在于分词技术的使用。中文分词技术,采用大量的算法,优化查找过程。执行流程如下:
a、 将需要内链的关键词,添加到词典内。添加到什么地方的词典?当然是添加到分词词典。目前的分词技术,主要还是基于词典的分词。我们把默认的词典保留最小化版本。再把我们的内链词,添加到自定义词典内。标记为一个特殊的词性。下面会有代码演示。
b、 使用分词技术对一篇文章进行分词切词处理。
c、 输出带指定词性(即我们添加的关键词词典)的关键词。即可得到本文的所有包含关键词信息。
d、 查询关键词的链接,添加替换文章内容即可。
这种方式看起来复杂程度也是比较高的,但是可以实现百万内的内链快速查询。响应和处理时间也在一两秒以内可以完全成功识别。
市面上可以使用中文分词的工具非常多。比如:结巴分词、IK分词、MMSeg、盘古分词等等。
下面示例一段Python使用结巴分词执行的结果:
核心代码:
jieba.set_dictionary(os.path.abspath(os.curdir) + "/dict.txt.small") # 使用自定义词库替换系统词库
jieba.load_userdict('user.txt') # 添加自定义词库,需要设定为custom自定义词性:坚持问题导向 10 custom
content = '57雇主担保签证是澳大利亚政府为澳洲企业从海外引进各类专业人士而设立的一种临时工作签证,该签证的有效期为3个月至4年不等, 旨在填补澳洲工人难以填补的职位空缺。由于457签证审理速度快,申请要求低,在持有该签证有效期间,若在澳大利亚工作满两年后可申请转为永久居民,因此备受青睐。澳大利亚政府有一个紧缺的技术职业清单,但近年来,政府两党都对此表达了批评和不满,认为该职业名单已经变得太广泛。此外,虚假雇主担保问题日益突出,也令移民局不断收紧对457签证的审批。前不久,有媒体曝出了一段揭露澳洲雇主买卖担保名额的录音。一位中国留学生在电话里询问一家Domino\'s披萨店的老板,是否能出售雇主担保名额。澳洲移民局表示,这种行为严重违反了签证条款,对此的处罚包括2年的监禁和最高32.4万澳元(约合170万人民币)的罚款。'
# jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
def parseContent(content):
"""
把内容进行分词,并把自定义词性的词添加到列表里面返回。用于自定义词库分词处理
:param content:
:return:
"""
words = pseg.cut(content)
result = set() # 添加一个不重复的set
for word, flag in words:
# 打印 分词的词结果及词性信息
# print word+"====="+flag
# 把词性为custom的,即自定义词库的内容输出
if flag == "custom":
result.add(word)
return result
有兴趣的可以放大研究。这种方式,10万词,在2秒内可以计算得出。如果以服务化的形式词库驻内存,加上并发优化。性能还可以进一步提高。
总结这种方式:把内链词,建立为自定义词库,标记为自定义词。然后用自定义去切词分词。最后切出来的结果是带词性的,只输出我们设置的自定义词性的词,就能快速得到结果。
为什么分词会比传统方式更快呢。因为分词算法已经进行了大量的优化,使用了很多算法在代码里面进行优化。
这里面还可以进行很多优化,比如重写一些分词的核心逻辑,只使用自定义词进行分词,不是自定义词的一率删除不处理。服务化为Web服务,词典常驻内存;增加处理并发量等。都是可以实施的方案。
中小型企业10万或者百万内链,应该是能满足需求了。
千万级内链系统架构二:千万级的内链系统架构。
千万级的内链架构是百万级架构基础上的升级。依然依托外部工具实现,这次使用的是全文检索引擎。
单机离线使用Lucenue全文引擎配合自定义词库加中文分词器。分布式非实时业务,可以使用SolrCloud分布式或者单机使用。分布式实时业务,可以使用ElasticSearch加上自定义词库及中文分词技术,进行技术实施。
核心的原理和方案一是一样的,只是使用定制开发过后的代码,能极大的提升系统的可用性和实时性。在ES架构上面。亿级的分词检索,可以秒级返回数据。
千万级使用ElasticSearch需要一些二次开发。不在本文讨论范围内。
请继续关注下篇干货。