大型网站架构设计-Solr

2015-1-7 19:26:59     101 人阅读    

       Solr是一个基于Lucene、功能强大的搜索引擎工具,它对Lucene进行了扩展,提供一系列 功能强大的HTTP操作接口,支持通过Data Schema来定义字段、类型和设置文本分析,使得 用户可以通过HTTP POST请求,向服务器提交Document,生成索引,以及进行索引的更新和 删除操作。对于复杂的查询条件,Solr提供了一整套表达式查询语言,能够更方便地实现包括 字段匹配、模糊查询、分组统计等功能;同时,Solr还提供了强大的可配置能力,以及功能完 善的后台管理系统。Solr的架构如图2-25所示。

图2-25 Solr的架构35

1. Solr的配置
通过Solr的官方站点下载Solr:

wget http://apache.fayea.com/apache-mirror/lucene/solr/4.7.2/solr-4.7.2.tgz
longlong@ubuntu:~/tenp$ wget http://apache.fayea.eom/apache-mirror/lucene/solr/4 ,7.2/solr-4.7.2.tgz
-04-26 22:11:13-- http://apache.fayea.eom/apache-nirror/lucene/solr/4.7.2 /solr-4.7.2.tgz
Resolving apache.fayea.con (apache.fayea.com)... 220.166.52.227, 220.166.52.226 Connecting to apache.fayea.com (apache.fdyed.com)|226.166.52.227|:86*.. connecte
d.
HTTP request sent, awaiting response... 200 OK Length: 151973754 (145M) [applicatlon/x-gzlp]
Saving to: 'solr-4.7.2.tgz'
0% [ ] 1,159,198 451K/S |

图片来源http://images.cnitbtog.com/btog/483523/201308/20142655-8e3153496cf244a280c5e195232ba962.x-png,
解压:
tar -xf solr-4.7.2.tgz
修改 Tomcat 的 conf/server.xml 中的 Connector 配置,将 URIEncoding 编码设置为 UTF-8,
否则中文将会乱码,从而导致搜索查询不到结果。

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>


     将Solr的dist目录下的solr-{version}.war包复制到tomcat的webapps目录下,并且重命名 为 solr.war。
      配置Solr的home目录,包括schema文件、solrconfig文件及索引文件,如果是第一次配 置Solr,可以直接复制example目录下的Solr目录作为Solr的home,并通过修改tomcat的启 动脚本catalina.sh来指定solr.solr.home变量所代表的Solr home路径。
CATALINA_〇PTS="$CATALINA_〇PTS -Dsolr.solr.home=/usr/solr"
启动Tomcat,访问Solr的管理页面,如图2-26所示。

图2-26 Solr的管理页面

 

2.构建索引
        在构建索引之前,首先需要定义好Document的schema。同数据库建表有点类似,即每个 Document包含哪些Field,对应的Field的name是什么,Field是什么类型,是否被索引,是否 被存储,等等。假设我们要构建一个讨论社区,需要对社区内的帖子进行搜索,那么搜索引擎 的Document中应该包含帖子信息、版块信息、版主信息、发帖人信息、回复总数等内容的聚 合,如图2-27所示。


图2-27帖子、版块、用户、评论总数的关联关系
         其中,post用来描述用户发布的帖子信息,section则表示版块信息,user代表该社区的用 户,comment_count用来记录帖子的评价总数。
对帖子信息建立搜索引擎的好处在于,由于帖子的数据量大,如采用MySQL这一类的关 系型数据库来进行存储的话,需要进行分库分表。数据经过拆分之后,就难以同时满足多维度 复杂条件查询的需求,并且查询可能需要版块、帖子、用户等多个表进行关联查询,导致查询 性能下降,甚至回帖总数这样的数据有可能根本就没有存储在关系型数据库当中,而通过搜索 引擎,这些需求都能够很好地得到满足。
搜索引擎对应的schema文件定义可能是下面这个样子:

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="post" version="1.5">
<fields>
<field name="_version_" type="long" indexed="true" stored="true"/> <field name="post_id" type="long" indexed="true" stored="true" required= "true"/>
<field name="post_title" type="string" indexed="true" stored="true"/> <field name="poster_id" type="long" indexed="true" stored="true" /> <field name="poster_nick" type="string" indexed="true" stored="true"/> <field name="post_content" type="text_general" indexed="true" stored= "true"/>
<field name="poster_degree" type="int" indexed="true" stored="true"/>
<field name=nsection_idn type=nlongn indexed=ntruen stored=ntruen /> <field name=nsection_namen type=nstring" indexed=ntruen stored=ntruen /> <field name="section_owner_id" type="long" indexed="true" stored="true"/> <field na^e="section_owner_nick" type="string" indexed="true" stored="true"/> <field name="gmt_modified" type="date" indexed="true" stored="true"/> <field name="gmt_create" type="date" indexed="true" stored="true"/> <field name="comment_count" type="int" indexed="true" stored="true"/> field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
</fields> <uniqueKey>post_id</uniqueKey>
<copyField source="post_content" dest="text"/> <copyField source="post_content" dest="text"/> <copyField source="section_name" dest="text"/>
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" /> <fieldType name="int" class="solr.TrieIntField" precisionStep="0" p〇siti〇nIncrementGap=nOn/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" p〇siti〇nIncrementGap=nOn/>
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" p〇siti〇nIncrementGap=nOn/>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap=
"100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>
</fieldType>
</types>
</schema>


fields标签中所包含的就是定义的这些字段,包括对应的字段名称、字段类型、是否索引、 是否存储、是否多值等;uniqueKey指定了 Document的唯一键约束;types标签中则定义了可 能用到的数据类型。
使用HTTP POST请求可以给搜索引擎添加或者更新已存在的索引:
http://hostname:8080/solr/core/update?wt=json
POST的JSON内容:

{
"add": {
"doc": {
"post_id": "123456",
"post_title": "Nginx 1.6稳定版发布,顶级网站用量超越 Apache", "poster_id": "340032", "poster_nick": "hello123",
"post_content": "据W3Techs统计数据显示,全球Alexa排名前100万的网站 中的23.3%都在使用 nginx , -数据为
nginx 的使用量超过了 Apache,位居第1位。",
"poster_degree": "2",
"section_id": "422",
"section_name": "技术", "section_owner_id": "232133333", "section_owner_nick": "chenkangxian", "gmt_modified": "2013-05-07T12:09:12Z" "gmt_create": "2013-05-07T12:09:12Z", "comment count": "3"
boost": 1, overwrite": true,
T commitWithin": 1000
}
}


服务端的响应:

{
"responseHeader": {
"status": 0, "QTime": 14
}
}


通过上述的HTTP POST请求,便可将Document添加到搜索引擎中。

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


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

jQuery学习笔记二:DOM操作   上一篇
下一篇  mysql哈希索引

精彩回复
发表评论
姓名:       

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