1.Solr的安装与配置
2.Solr的几个基本概念
3.向Solr中单条写入数据和批量写入数据
4.对Solr中的数据精确查询或模糊查询
5.Solr的中文分词
6.单实例下Solr的主从配置
1.1、安装JDK
⑴.使用yum安装:yum -y install java-1.7.0-openjdk
⑵.下载jdk-7u65-linux-x64.gz解压到/usr/local/
#tarzxf jdk-7u65-linux-x64.gz -C /usr/local
修改/etc/profile配置环境变量,添加一下内容:
exportJAVA_HOME=/usr/local/jdk1.7.0_65
exportLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportPATH=$PATH:$JAVA_HOME/bin
使用命令source /etc/profile使配置即时生效。
1.2、下载apache-tomcat-7.0.54.tar.gz并配置
#tarzxf apache-tomcat-7.0.54.tar.gz -C /usr/local/
#ln -s /usr/local/apache-tomcat-7.0.54/ /usr/local/tomcat
编辑vim /usr/local/tomcat/conf/server.xml文件,修改第124行:
指定Solr的webapp位置,这里的webapps-solr是用的相对位置(对应的绝对位置是/usr/local/tomcat/webapps-solr)
#mkdir /usr/local/tomcat/webapps-solr
1.3、下载solr-4.7.2.tgz并配置Solr
#tar zxf solr-4.7.2.tgz
#cp solr-4.7.2/example/webapps/solr.war/usr/local/tomcat/webapps-solr
启动tomcat自动解压solr.war文件,并将相关jar包拷贝到Solr的工作目录下
#/usr/local/tomcat/bin/startup.sh
#cp solr-4.7.2/example/lib/ext/*/usr/local/tomcat/webapps-solr/solr/WEB-INF/lib
修改/usr/local/tomcat/webapps-solr/solr/WEB-INF/web.xml文件指定Solr的数据目录
#vim /usr/local/tomcat/webapps-solr/solr/WEB-INF/web.xml
删除原来第40,46行的注释符,修改第42行指定到/data/solrbase(当然你可以指定到任何位置)
#mkdir -p /data/solrbase/
#cp solr-4.7.2/example/solr/solr.xml/data/solrbase //很重要
从solr-4.9.0/example/lib/ext/*下拷贝所有jar包到/usr/local/tomcat/webapps-solr/solr/WEB-INF/lib/
#cp solr-4.7.2/example/resources/log4j.properties /usr/local/tomcat/webapps-solr/solr/WEB-INF/lib/
#cp solr-4.7.2/example/lib/ext/*/usr/local/tomcat/webapps-solr/solr/WEB-INF/lib/
重启tomcat看到如下界面:
1.4、为你的Solr创建第一个Core(core的概念:每个core即一个索引库,可以理解每个core对应一个数据库实体表。)
创建一个名字叫product的Core:
#mkdir /data/solrbase/product
#echo name=product > /data/solrbase/product/core.properties//很重要
#mkdir /data/solrbase/product/conf
#cd /data/solrbase/product/conf
创建product的Core配置文件, solrconfig.xml、 schema.xml(如果你赖的手工写,可以从solr-4.7.2/example/solr/collection1整个目录下拷贝到/data/solrbase)
#vim solrconfig.xml
<?xmlversion="1.0" encoding="UTF-8" ?>
<config>
<luceneMatchVersion>4.7</luceneMatchVersion>
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
<dataDir>${solr.product.data.dir:}</dataDir>
<schemaFactory class="ClassicIndexSchemaFactory"/>
<updateHandlerclass="solr.DirectUpdateHandler2">
<updateLog>
<str name="dir">${solr.product.data.dir:}</str>
</updateLog>
</updateHandler>
<requestHandler name="/get" class="solr.RealTimeGetHandler">
<lst name="defaults">
<str name="omitHeader">true</str>
</lst>
</requestHandler>
<requestHandler name="/replication"class="solr.ReplicationHandler" startup="lazy" />
<requestDispatcher handleSelect="true" >
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" formdataUploadLimitInKB="2048" />
</requestDispatcher>
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
<requestHandler name="/analysis/field"startup="lazy" class="solr.FieldAnalysisRequestHandler" />
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
<requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
<requestHandler name="/admin/ping"class="solr.PingRequestHandler">
<lst name="invariants">
<str name="q">solrpingquery</str>
</lst>
<lst name="defaults">
<str name="echoParams">all</str>
</lst>
</requestHandler>
<admin>
<defaultQuery>productdesc</defaultQuery>
</admin>
</config>
具体解释: http://www.blogjava.net/conans/articles/379545.html
#vim schema.xml
<?xmlversion="1.0" ?>
<schemaname="product" version="1.1">
<fieldtypename="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldTypename="int"class="solr.IntField" omitNorms="true"/>
<fieldTypename="long" class="solr.TrieLongField" precisionStep="0" positionIncr
ementGap="0"/>
<field name="pid" type="int" indexed="true" stored="true" multiValued="false"required="true"/>
<field name="prodesc"type="string" indexed="true" stored="true" multiValued="false"required="true"/>
<fieldname="_version_" type="long" indexed="true" stored="true"/>
<uniqueKey>pid</uniqueKey>
<defaultSearchField>prodesc</defaultSearchField>
<solrQueryParser defaultOperator="OR"/>
</schema>
具体解释:
http://www.blogjava.net/conans/articles/379545.html
Document:Solr的信息的基本单位的是Document,它是一组描述某些事物的数据集合。
Field: Document的主要构成单元,是更具体的信息描述。
其实大家可以这样理解,Document 对应于Java代码中的一个类;而Field,则是类中的一个属性。
FieldAnalysis:就是solr如何对传进来的数据进行处理,如何构建索引。假设有个个人简介的Field,他里面包括了很多单词,我们需要在构建索引完之后,通过检索某个单词就能查询到这个人,那么我们就需要对每个单词都进行索引,但是,一句话有很多语气助词,如果a an or and not (啊噢 喔 哦等),这些词我们又不需要为他们建索引,在构建索相的时候,需要排除出去。那么那些单词我们要建索引,那些又不需要列,这个分析出过程,我们就称为:field Analysis.
FieldType:告诉solr如何去处理某个field的数据,以及这个Field在查询的时候如何处理。
一个Field Type包括如下四部分信息:
名字,name
实现类名,也就是solr中真正的类型的类名。
如果FieldType是 TextFiled类型,即还有analysis属性
属性
2.基于xml格式的单条数据插入:
http://192.168.8.96:8080/solr/product/update/?stream.body=<add><doc><fieldname="pid">2</field><fieldname="prodesc" >电脑管家云查杀引擎扫描</field></doc></add>&stream.contentType=text/xml;charset=utf-8&commit=true
3.基于Json格式的单条数据插入:
http://192.168.8.96:8080/solr/product/update/?stream.body={"add":{"doc":{"pid":3, "prodesc":"这是一个测试"}}}&commit=true
4.从Mysql数据库中将数据批量导入:
⑴.编辑solrconfig.xml 注册一个请求uri为 "/dataimport"的请求处理器(org.apache.solr.handler.dataimport.DataImportHandler),代码如(插入到倒数第2行):
<requestHandler name="/dataimport"class="org.apache.solr.handler.dataimport.Data
ImportHandler">
<lst name="defaults">
<str name="config">mysql-data-config.xml</str>
</lst>
</requestHandler>
⑵.创建mysql-data-config.xml文件放到solr.home/conf 目录下,内容如下:
#vimmysql-data-config.xml
⑺.在图形界面下批量导入数据:
使用命令的方式:
http://192.168.8.96:8080/solr/product/dataimport?command=full-import 这url告诉 solr 做全量索引,做索引中会删除所有数据。当然也可以用clean=false 参数来告诉它不删除,但也会删除相同id的(在scheam.xml 的uniqueKey声明的)http://192.168.8.96:8080/solr/product/dataimport?command=full-import&clean=false
这里的中文分词以IK为例,其他的略过:
1.下载
wgethttp://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip
2.配置
#unzip IK\ Analyzer\2012FF_hf1.zip
#cp IKAnalyzer2012FF_u1.jar /usr/local/tomcat/webapps-solr/solr/WEB-INF/lib
#mkdir /usr/local/tomcat/webapps-solr/solr/WEB-INF/class
#cpIKAnalyzer.cfg.xml /usr/local/tomcat/webapps-solr/solr/WEB-INF/class
#cpstopword.dic /usr/local/tomcat/webapps-solr/solr/WEB-INF/class
编辑schema.xml文件对分词进行配置:
在<schema name="product" version="1.1">所在行下,添加一下内容:
<types>
<fieldType name="split_cn" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
</types>
将<field name="prodesc"type="string" indexed="true" stored="true" multiValued="fal
se"required="true"/>
改成<field name="prodesc"type="split_cn" indexed="true"stored="true" multiValued="false"required="true"/>
配置IKAnalyzer分词器的扩展词典,停止词词典:
#vim cn_ext.dic #创建一个中文分词的扩展字典
世界工厂
人民共和
#vim IKAnalyzer.cfg.xml #修改其扩展词典的选项,如下
<comment>IKAnalyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">cn_ext.dic;</entry>
重启tomcat服务并测试分词效果,多了人民共和一项:
扩展现有的停止词词典:
#vimstopword.dic #在最后添加如下三个词
共和国
共和
国
重启tomcat服务并测试分词效果,少了共和国、共和、国三项。
1.编辑主服务器的solrconfig.xml,在</config>上一行加入:
<requestHandler name="/replication"class="solr.ReplicationHandler" >
<lstname="master">
<strname="replicateAfter">startup</str>
<strname="replicateAfter">commit</str>
<strname="confFiles">schema.xml,stopwords.dic,elevate.xml</str>
<strname="commitReserveDuration">00:00:10</str>
</lst>
<strname="maxNumberOfBackups">1</str>
</requestHandler>
2.编辑从服务器的solrconfig.xml,在</config>上一行加入:
<requestHandler name="/replication"class="solr.ReplicationHandler" >
<lstname="slave">
<strname="masterUrl">http://192.168.8.96:8080/solr/product</str>
<strname="pollInterval">00:00:20</str>
<strname="compression">internal</str>
<strname="httpConnTimeout">5000</str>
<strname="httpReadTimeout">10000</str>
</lst>
</requestHandler>
主从一致性的验证:
⑴.重启主从两台服务器的tomcat服务:
⑵.在主服务器上增删数据:
增加一条数据(记得先查看从Solr上是否有这条记录)
http://192.168.8.96:8080/solr/product/update/?stream.body={"add":{"doc":{"pid":121, "prodesc":"这是一个测试"}}}&commit=true
删除一条数据(记得先查看从Solr上是否有这条记录)
http://192.168.8.96:8080/solr/product/update/?stream.body=<delete><id>15</id></delete>&stream.contentType=text/xml;charset=utf-8&commit=true
⑶.检验从服务器上,是否多了pid为121的记录,是否少了pid为15的记录
http://192.168.8.96:8080/solr/product/select?q=pid:121&wt=json&indent=true
http://192.168.8.96:8080/solr/product/select?q=pid:15&wt=json&indent=true