Solr
首先我们来介绍哈啥子是Solr
Solr基于全文检索的企业级应用服务器,是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果
全文检索:可以输入一段文字,通过分词检索数据。
应用服务器:它是单独的服务。
介绍图如下:
1、lucene:
全文检索工具包
2、Lucene的工作原理:
索引数据的创建:
从原始文件中提取一些可以用来搜索的数据(封装成各种Field),把各field再封装成document,然后对document进行分析(对各字段分词),得到一些索引目录写入索引库,document本身也会被写入一个文档信息库;
索引数据的查询:
根据关键词解析(queryParser)出查询条件query(Termquery),利用搜索工具(indexSearcher)去索引库获取文档id,然后再根据文档id去文档信息库获取文档信息
分词器不同,建立的索引数据就不同;比较通用的一个中文分词器IKAnalyzer的用法
3、相关度得分
a) 在建立索引的时候,给指定文档的指定域设置一个权重Field.setBoosts()
b) 在搜索的时候,可以给不同的搜索域设置不同的权重
Solr有什么特点:
Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。
【Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构】
同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
Solr工作方式:
文档通过Http利用XML 加到一个搜索集合中。
查询该集合也是通过http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
上面基本的概念搞完了,接下来就是动手操作的时候,这里提醒一哈,刚接触配置相关的东西的时候出错和不会是难免的,所以,慢慢配就是了,还有就是在配的时候一定要仔细,稍有不慎就漏了某个地方,或者配置路径等缺胳膊少腿的。所以一定要仔细,还有要有耐心。这里我会全面介绍一遍配置,注意点的地方我会特别提醒的,So ,仔细看。
第一步:
提供几个下载地址:
官方下载:http://archive.apache.org/dist/lucene/solr/4.7.2/
百度网盘: http://pan.baidu.com/s/1dEsPoel 密码: hmnb tomcat
百度网盘: http://pan.baidu.com/s/1nu2cxBF 密码: jk5a solr4.7.2
百度网盘: http://pan.baidu.com/s/1dEwngNB 密码: 2ha6 solr5.4.1
因为在官网上下载实在是太慢了,只是提供下载而已。和本文的配置不沾边,本文是用solr-4.7.0配置安装
有了solr,来我们解压后是这样子的
第二步:
我们在D盘还是那个盘新建一个 :D:\MySoft\solr\home 这样子的目录
第三步:
在你解压的solr文件中按到:solr-4.7.0\example\solr 目录下把里面所有的文件(如下如所示所有文件)复制一份到我们第二步新建目录home下:
结果如下图所示:
第四步:
把solr-4.7.0 \dist中的war包复制到tomcat/webapps下
结果图:
注意点:
你复制进来了就直接解压文件,然后就有个上面图中 solr-4.7.0 文件夹 ,我认为解压后最好删掉 war包,因为你如果在启动tomcat 的时候 tomcat 会自动解压 solr-4.7.0.war 这个文件,然后你配置好的 solr-4.7.0 文件夹里面的东西就可能会洗白,导致出错。
第五步:添加日志
这里我们需要在 tomcat/webapps/solr-4.7.0 目录下,新建目录classpath,然后并把 solr-4.7.0\example\resources下的 log4j.properties文件复制到刚刚新建的classpath目录下。
然后我们再把 solr-4.7.0\example\lib\ext下的所有的jar(下图所示)包复制到 tomcat目录下的lib目录下
第六步:
在 tomcat 下的 中的 \webapps\solr\WEB-INF下的web.xml中修改env-entry,你开始会看见是被注释掉的,你需要取消注释,然后修改成你的路径
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\MySoft\solr\home</env-entry-value> //修改这里路径就行了,这里的路径就是在第二步建的目录
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
第七步:
tomcat 下的 中的 \webapps\solr-4.7.0\WEB-INF\lib 下的所有jar包复制到 tomcat的lib中
第八步:启动tomcat,运行 http://localhost:8080/solr-4.7.0/
!!!这里提醒哈在访问路径中就是我红色框框起来的来的地方是根据你的 tomcat 下的 中的 \webapps下的 solr 文件名
如果你访问后页面出现如下图,说明配置成功,反之就错误,如果错误了,比如提示500错误,那肯定是哪个jar包没有复制,或者需要修改的xml文件没有修改正确。
接下来我们来配置中文分词器。这里我是配置的是 ikanalyzer 分词器
在谷歌http://code.google.com/p/ik-analyzer/downloads/list下载IK Analyzer 2012FF_hf1解压后得到如下目录结构:
第一步:
将 ikanalyzer-2012_u6.jar 包复制到 tomcat 下的 webapps/solr-4.7.0/WEB-INF/lib 下。
提醒!!!
我之前看其他说的,是复制的 IKAnalyzer2012_u6.jar 这个jar 包,(注意前面的首字母大小写),然后启动 tomcat ,虽然访问http://localhost:8080/solr-4.7.0/时可以显示上面成功的界面,如下如红色框的样子就是分词器配置错误了,然后分词器就不能用,后面程序也跟到出错。原因我猜可能是版本之间的兼容有问题。反正导入那个小写字母开头的jar包就没有问题。
第二步:
tomcat 下的 webapps/solr-4.7.0/WEB-INF 下创建classes目录,然后将 IKAnalyzer.cfg.xml、stopword.dic 复制到 刚新建的目录下
结果图:
第三步:
我们在最初第二步新建的目录 D:\MySoft\solr\home 下的 collection1\conf 中找到 schema.xml 这个文件(下图红色框框起来的那个),然后用可以打开的软件打开
然后我们在里面添加
这里添加的位置,你打开 schema.xml 文件后,根据物以类聚的法则,一眼就晓得放在那个位置了是吧
这里说一哈“添加3”除了 name 是可以自己随便写的,其他的都是固定的,然后“添加1”中的 name="id" 原本就有,就不用添加也不用修改,
然后 name="address_keywords" 也是一样的,其他的部分则是看自己的情况增加,
这里提醒一哈你每添加一个 field 下面都要有一个对应的 copyField 。
<!--**********************添加1******************************-->
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="address_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<field name="userName" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="userTel" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="province" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="city" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="dist" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="street" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<!--*********************************************************-->
<!--************************添加2****************************-->
<!-- 配置分词 检索的中文 字段 -->
<copyField source="userName" dest="address_keywords"/>
<copyField source="userTel" dest="address_keywords"/>
<copyField source="province" dest="address_keywords"/>
<copyField source="city" dest="address_keywords"/>
<copyField source="dist" dest="address_keywords"/>
<copyField source="street" dest="address_keywords"/>
<!--*********************************************************-->
<!--************************添加3****************************-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<!--********************************************************-->
---------------------加点知识点-------------------------------------------
Solr中Field常用属性
<FieldType>
name:就是FieldType的名称
class:指向了org.apache.slor.analysis对应的class名称,用这个来定义类型的行为
Eg:<fieldType name="text_ik" class="solr.TextField">...</fieldType>
---------------
<Field>
Name:是查询时的名称
Type:这个是之前定义的FieldType的名称
Indexed:是否索引(true/false)
Stored:是否存储(是否将索引结果存储到索引库 | true/false )
multiValued:是否多值(一般配合copyField使用)
Eg: <field name="address_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
---------------
<copyField>
Source:是Field域的名称
Dest:是destination的缩写 目标域
应用场景:
我们在搜索时比如输入java,一篇文章分为标题、简介、内容等很多字段,输入的关键字需要制定solr中的域进行检索,
不可能从一个表中将所有字段进行索引,因为有些字段不需要索引,所以出现copyField域,把多个域的关键词复制到同一个域,
多个域时,可以放到一个域中。就不用定义那么多域了。搜索比较方便
Eg:<copyField source="userName" dest="address_keywords"/>
---------------
<dynamicField>
name为*_i,定义它的type为int,那么在使用这个字段的时候,任务以_i结果的字段都被认为符合这个定义
Eg:<dynamicField name=”*_i” type=”int” indexed=”true” stored=”true”/>
这里我打包了一个solr项目和相关资源:
点击下载
在你导入项目后需要自己配置你的数据库连接和新建一个表格:tbl_address
字段:
在我们启动tomcat的时候可能加载程序要点时间所以我们可以在tomcat中修改一下加载最长时间,如图下位置,一般加到60以上就行了
为了避免仔细中还难免的错误,这里我提出几点错误和解决办法
第一种:
org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Expected mime type application/octet-stream but got text/html.
1)、提示这种错误可能就是我上面说的分词器配置错误了
你也会在访问 http://localhost:8080/solr-4.7.0/ 的发现如下如所示
解决办法
在 tomcat 下的 webapps/solr-4.7.0/WEB-INF/lib 下找到你之前导入的 Ikanalyzer-2012_u6.jar 看不是不首字母是大写“I”开头的,如果是删除换上 ikanalyzer-2012_u6.jar 就行了。或者其他兼容的版本。
2)、或者是你的 schema.xml 文件中 配置错误
3)、可能是你项目中 baseUrl 路径错误
第二种:
页面提示 :HTTP Status 500 – Internal Server Error
{msg=SolrCore ‘collection1’ is not available due to init failure: Could not load config file…
遇到这种错误就是你没有在 tomcat 下的 中的 \webapps\solr\WEB-INF下的web.xml中修改env-entry,或者说你是在 tomcat 下的 web.xml中添加的 env-entry 这里一定注意 web.xml位置
如果你想自己新建一个core ,而且新建失败了,可以 点击这里 看一哈解决办法。