大型网站架构设计-垂直化搜索引擎

2014-12-23 13:37:01     47 人阅读    

            这里所介绍的垂直化搜索引擎,与大家所熟知的Google和Baidu等互联网搜索引擎存在着 一些差别。垂直化的搜索引擎主要针对企业内部的自有数据的检索,而不像Google和Baidu等 搜索引擎平台,采用网络爬虫对全网数据进行抓取,从而建立索引并提供给用户进行检索。在 分布式系统中,垂直化的搜索引擎是一个非常重要的角色,它既能满足用户对于全文检索、模 糊匹配的需求,解决数据库like查询效率低下的问题,又能够解决分布式环境下,由于采用分 库分表或者使用NoSQL数据库,导致无法进行多表关联或者进行复杂查询的问题。
            本节将重点介绍搜索引擎的基本原理和Apache Lucence的使用,以及基于Lucence的另一 个强大的搜索引擎工具Solr的一些简单配置。
2.4.1 Lucene 简介
         要深入理解垂直化搜索引擎的架构,不得不提到当前全球范围内使用十分广泛的一个开源检索工具 Lucene24。Lucene是Apache旗下的一款高性能、可伸缩的开源的信息检索库,最初是由DougCutting25开发,并在SourceForge的网站上提供下载。从2001年9月开始,Lucene 作为高质量的开源Java产品加入到Apache软件基金会,经过多年的不断发展,Lucene被翻译 成C++、C#、perl、Python等多种语言,在全球范围内众多知名互联网企业中得到了极为广泛 的应用。通过Lucene,可以十分容易地为应用程序添加文本搜索功能,而不必深入地了解搜索 引擎实现的技术细节以及高深的算法,极大地降低了搜索技术推广及使用的门槛。
       Lucene与搜索应用程序之间的关系如图2-19所示。


          Lucene 项目地址为 https://lucene.apache.org
         开源领域的重量级人物,创建了多个成功的开源项目,包括Lucene、Nutch和Hadoop
         图2-19 Lucene与搜索应用程序之间的关系26 在学习使用Lucene之前,需要理解搜索引擎的几个重要概念:
倒排索引(inverted index)也称为反向索引,是搜索引擎中最常见的数据结构,几乎所有 的搜索引擎都会用到倒排索引。它将文档中的词作为关键字,建立词与文档的映射关系,通过 对倒排索引的检索,可以根据词快速获取包含这个词的文档列表,这对于搜索引擎来说至关重
要。
        分词又称为切词,就是将句子或者段落进行切割,从中提取出包含固定语义的词。对于英 语来说,语言的基本单位就是单词,因此分词特别容易,只需要根据空格/符号/段落进行分割, 并且排除停止词(stop word),提取词干27即可完成。但是对于中文来说,要将一段文字准确地 切分成一个个词,就不那么容易了。中文以字为最小单位,多个字连在一起才能构成一个表达 具体含义的词。中文会用明显的标点符号来分割句子和段落,唯独词没有一个形式上的分割符, 因此,对于支持中文搜索的搜索引擎来说,需要一个合适的中文分词工具,以便建立倒排索引。
        停止词(stop word),在英语中包含了 a、the、and这样使用频率很高的词,如果这些词都 被建到索引中进行索引的话,搜索引擎就没有任何意义了,因为几乎所有的文档都会包含这些 词。对于中文来说也是如此,中文里面也有一些出现频率很高的词,如“在”、“这”、“了”、“于” 等,这些词没有具体含义,区分度低,搜索引擎对这些词进行索引没有任何意义,因此,停止 词需要被忽略掉。
排序,当输入一个关键字进行搜索时,可能会命中许多文档,搜索引擎给用户的价值就是 快速地找到需要的文档,因此,需要将相关度更大的内容排在前面,以便用户能够更快地筛选 出有价值的内容。这时就需要有适当的排序算法。一般来说,命中标题的文档将比命中内容的 文档有更高的相关性,命中多次的文档比命中一次的文档有更高的相关性。商业化的搜索引擎 的排序规则十分复杂,搜索结果的排序融入了广告、竞价排名等因素,由于涉及的利益广泛, 一般属于核心的商业机密。
        另外,关于Lucene的几个概念也值得关注一下:
        文档(Document),在Lucene的定义中,文档是一系列域(Field)的组合,而文档的域则
        代表一系列与文档相关的内容。与数据库表的记录的概念有点类似,一行记录所包含的字段对 应的就是文档的域。举例来说,一个文档比如老师的个人信息,可能包括年龄、身高、性别、 个人简介等内容。
域(Field),索引的每个文档中都包含一个或者多个不同名称的域,每个域都包含了域的名
        图片来源 https://www.ibm.com/developerworks/cn/java/j-lo-lucene1/fig001.jpg
       提取词干是西方语言特有的处理步骤,比如英文中的单词有单复数的变形,-mg和-ed的变形,但是在 搜索引擎中,应该当作同一个词。
称和域对应的值,并且域还可以是不同的类型,如字符串、整型、浮点型等。
       词(Term), Term是搜索的基本单元,与Field对应,它包括了搜索的域的名称以及搜索的 关键词,可以用它来查询指定域中包含特定内容的文档。
       査询(Query),最基本的查询可能是一系列Term的条件组合,称为TermQuery,但也有可 能是短语查询(PhraseQuery)、前缀查询(PrefixQuery)、范围查询(包括TermRangeQuery、 NumericRangeQuery 等)等。
分词器(Analyzer),文档在被索引之前,需要经过分词器处理,以提取关键的语义单元, 建立索引,并剔除无用的信息,如停止词等,以提高查询的准确性。中文分词与西文分词的区 别在于,中文对于词的提取更为复杂。常用的中文分词器包括一元分词28、二元分词29、词库分 词30等。
如图2-20所示,Lucene索引的构建过程大致分为这样几个步骤,通过指定的数据格式,将 Lucene的Document传递给分词器Analyzer进行分词,经过分词器分词之后,通过索引写入工 具IndexWriter将索引写入到指定的目录。

 

        而对索引的查询,大概可以分为如 下几个步骤,如图2-21所示。首先构 建查询的 Query,通过 IndexSearcher 进行查询,得到命中的TopDocs。然后 通过TopDocs的scoreDocs()方法,拿到 ScoreDoc,通过ScoreDoc,得到对应的 文档编号,IndexSearcher通过文档编 号,使用IndexReader对指定目录下的 索引内容进行读取,得到命中的文档后


       元元分词,即将给定白勺了. 串I 了. y为^单|位^进行切割j分词,^这种|分词方一式n人/为.明^^的陷是语义
不准,如“上海”两个字被切割成“上海”,但是包含“上海' “海上”的文档都会命中。
        二元分词比一元分词更符合中文的习惯,因为中文的大部分词汇都是两个字,但是问题依然存在。
        词库分词就是使用词库中定义的词来对字符串进行切分,这样的好处是分词更为准确,但是效率较# 元分词更低,且难以识别互联网世界中层出不穷的新兴词汇。

本文出自   《大型分布式网站架构设计与实践试读样章》 试读,如果感觉到对你有帮助可以去购买该书


原文地址:http://www.itmmd.com/201412/367.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

linux命令详解(21)用find查找文件,find命令详解   上一篇
下一篇  产品经理学习笔记(12)-新人入门产品运营

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!