- 浏览: 439075 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
qja:
Iterator.remove()这个方法也会出错的。
java.util.ConcurrentModificationException 出现的原因和解决办法 -
angeli:
List<String> save = new A ...
java.util.ConcurrentModificationException 出现的原因和解决办法 -
大峰子:
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
python学习笔记-Python交互模式下方向键出现乱码 -
anypwx:
牛哥,怎么找到的,解决了我的报错问题,谢谢
JSONObject NestableRuntimeException -
tp7300:
确实好很多了,谢谢博主。
Failed to install on device 'emulator-5554': timeout
本文地址:
http://zhoujianghai.iteye.com/blog/1540176
首先介绍一下solr:
Apache Solr (读音: SOLer) 是一个开源、高性能、采用Java开发、基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现。Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件(schema.xml)中使用:<uniqueKey>id</uniqueKey>
进行描述。solr有两个核心文件,solrconfig.xml和schema.xml。solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等;schema.xml配置映射了各种数据类型的索引方案,分词器的配置、索引文档中包含的字段也在此配置。
工作中主要用来分词和搜索,简单的工作原理是:利用分词器对数据源进行分词处理,然后根据分词结果建立索引库;查询的时候,利用分词器对查询语句进行分词,根据查询语句分词的结果在索引库中进行匹配,最后返回结果。
废话少说,下面开始solr之旅吧:
一.安装JDK和Tomcat
(2):安装tomcat,下载tomcat安装包,解压到apache-tomcat目录下
修改tomcat安装目录下的conf目录的server.xml
找到<Connector port="8080" .../>,加入URIEncoding="UTF-8",为了支持中文。
设置Java和tomcat环境变量
上面两步比较简单,这里就只简单描述一下,不明白的可以网上查资料。
二. 安装solr
下载solr包,http://labs.renren.com/apache-mirror/lucene/solr/3.5.0/apache-solr-3.5.0.zip
解压缩到apache-solr目录,把apache-solr/dist目录下的apache-solr-3.5.0.war 复制到$TOMCAT_HOME/webapps目录下,重命名为solr.war
复制apache-solr/example/solr到tomcat根目录下(如果你想配置多core(实例),就复制apache-solr/example/multicore到tomcat根目录下,不用复制solr了),作为solr/home,以后也可以往该目录添加 core,每个core下面都可以有自己的配置文件。
在apache-tomcat/conf/Catalina/localhost/下创建solr.xml(跟webapps下的solr项目同名),指定solr.war和solr/home的位置,让tomcat启动时就自动加载该应用。
solr.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="/home/zhoujh/java/apache-tomcat7/webapps/solr.war" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="/home/zhoujh/java/apache-tomcat7/solr" override="true" />
</Context>
然后在tomcat的bin目录下执行./startup.sh,启动tomcat
在地址栏访问http://localhost:8080/solr/
将会出现solr欢迎界面和admin入口
注:如果出现org.apache.solr.common.SolrException: Error loading class 'solr.VelocityResponseWriter' 异常,最简单的解决方法:找到$TOMCAT_HOME/solr/conf/solrconfig.xml,把<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" enable="${solr.velocity.enabled:true}"/>注释掉或者enable:false即可。如果一切顺利的话,现在可以看到solr的web管理界面了。不过要想实现分词的功能,得安装一个中文分词器,这里推荐IKAnalyzer或mmseg4j。
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包,采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力,采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。支持用户词典扩展定。
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
三. 配置中文分词器
下面分别安装这两个中文分词器,当然选择安装其中一个也是可以的。
(1)安装IKAnalyzer
下载地址: http://code.google.com/p/ik-analyzer/downloads/list
在当前目录下新建IKAnalyzer目录,解压到该目录下:unzip IKAnalyzer2012_u5.zip -d ./IKAnalyzer
把IKAnalyzer目录下的IKAnalyzer2012.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下
配置schema.xml,编辑$TOMCAT_HOME/solr/conf/schema.xml,在文件中添加下面这个fieldtype
注:下面的代码中多了很多“<span style="font-size: x-small;">”标签,这个是设置字体时iteye编辑器自己生成的。
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldType>
添加一个索引字段field,并应用上面配置的fieldtype
<field name="game_name" type="text" indexed="true" stored="true" required="true" />
然后找到这一句:<defaultSearchField>text</defaultSearchField>把它改成<defaultSearchField>game_name</defaultSearchField>
在浏览器打开http://localhost:8080/solr/admin/analysis.jsp,就可以进行分词处理了。
IKAnalyzer添加自定义分词词典:词典文件格式为无BOM的UTF-8编码的文本文件,文件扩展名不限,一次可以添加多个词库,每个词库以";"分开。把IKAnalyzer目录下的IKAnalyzer.cfg.xml和stopword.dic拷贝到$TOMCAT_HOME/webapps/solr/WEB_INF/classes目录下,可以自己新建一个mydic.dic文件,然后在IKAnalyzer.cfg.xml里进行配置。
(2)安装mmseg4j
下载地址:http://code.google.com/p/mmseg4j/downloads/list
在当前目录下新建mmseg4j目录,解压到该目录下:unzip mmseg4j-1.8.5.zip -d ./mmseg4j
把mmseg4j目录下的mmseg4j-all-1.8.5.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下
配置schema.xml,编辑$TOMCAT_HOME/solr/conf/schema.xml,在文件中添加下面这个fieldtype
<fieldtype name="textComplex" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/home/zhoujh/java/apache-tomcat7/solr/dict">
</tokenizer>
</analyzer>
</fieldtype>
<fieldtype name="textMaxWord" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="/home/zhoujh/java/apache-tomcat7/solr/dict">
</tokenizer>
</analyzer>
</fieldtype>
<fieldtype name="textSimple" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/home/zhoujh/java/apache-tomcat7/solr/dict">
</tokenizer>
</analyzer>
</fieldtype>
注意:dicPath的值改成你自己机器上相应的目录。
然后修改之前添加的filed,让其使用mmseg4j分词器
<field name="game_name" type="textComplex" indexed="true" stored="true" required="true" />
配置mmseg4j分词词典:MMSEG4J的词库是可以动态加载的,词库的编码必须是UTF-8,mmseg4j 默认从当前目录下的 data 目录读取上面的文件,当然也可以指定别的目录,比如我就放在自定义的dict目录下。自定义词库文件名必需是 "words" 为前缀和 ".dic" 为后缀。如:/data/words-my.dic。
这里直接把mmseg4j/data目录下的所有.dic文件拷贝到$TOMCAT_HOME/solr/dict目录下。共有:4个dic文件,chars.dic、units.dic、 words.dic、 words-my.dic。下面简单解释一下这几个文件的作用。
1、chars.dic,是单个字,和对应的频率,一行一对,字在全面,频率在后面,中间用空格分开。这个文件的信息是 complex 模式要用到的。在最后一条过虑规则中使用了频率信息。
2、units.dic,是单位的字,如:分、秒、年。
3、words.dic,是核心的词库文件,一行一条,不需要其它任何数据(如词长)。
4、words-my.dic,是自定义词库文件
在浏览器打开http://localhost:8080/solr/admin/analysis.jsp,就可以看到分词效果了。
现在,这两种分词方法都已配置好了,想用哪种就把查询的filed的type设置成哪种。
四. 导入文档数据
现在添加文本搜索的功能,首先导入数据源。
切换到/home/zhoujh/java/solr/apache-solr/example/exampledocs目录下,该目录下有很多xml文件,随便copy一个,改名位game_data.xml。如:cp hd.xml game_data.xml,修改内容如下:
<add>
<doc>
<field name="id">1</field>
<field name="game_name">魔兽世界</field>
</doc>
<doc>
<field name="id">2</field>
<field name="game_name">仙剑</field>
</doc>
<doc>
<field name="id">3</field>
<field name="game_name">传奇</field>
</doc>
<doc>
<field name="id">4</field>
<field name="game_name">极品飞车</field>
</doc>
<doc>
<field name="id">5</field>
<field name="game_name">轩辕剑</field>
</doc>
</add>
注意:该xml文件必须是UTF-8格式的。
然后提交到solr,在 /home/zhoujh/java/solr/apache-solr/example/exampledocs目录下执行命令:
[zhoujh@alexzhou exampledocs]$ java -Durl=http://localhost:8080/solr/update -Dcommit=yes -jar post.jar game_data.xml
如果输出下面的信息,则导入成功。注:xml文件中要有game_name这个field。如果出错,到$TOMCAT_HOME/logs/下看catalinaxxx.log日志信息
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8080/solr/update..
SimplePostTool: POSTing file game_data.xml
SimplePostTool: COMMITting Solr index changes..
检测是否有数据:http://localhost:8080/solr/select/?q=*:*,如果输出信息如下,就成功了。
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">0</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">*:*</str>
<str name="rows">10</str>
<str name="version">2.2</str>
</lst>
</lst>
<result name="response" numFound="5" start="0">
<doc>
<str name="game_name">魔兽世界</str>
<str name="id">1</str>
</doc>
<doc>
<str name="game_name">仙剑</str>
<str name="id">2</str>
</doc>
<doc>
<str name="game_name">传奇</str>
<str name="id">3</str>
</doc>
<doc>
<str name="game_name">极品飞车</str>
<str name="id">4</str>
</doc>
<doc>
<str name="game_name">轩辕剑</str>
<str name="id">5</str>
</doc>
</result>
</response>
不过在现实工作中,一般利用数据库作为数据源,下面我们来配置solr连接数据库源。
五. solr从数据库导入数据
(1)安装mysql,
安装完后执行以下命令:启动mysql服务,进入mysql,创建数据库kw_game,创建表game,导入数据
sudo /etc/init.d/mysqld start
mysql -u root -p
create database kw_game;
use kw_game;
create table game(id int primary key auto_increment,game_name varchar(100),add_time datetime);
insert into game(game_name,add_time) values("魔兽世界",now());
insert into game(game_name,add_time) values("魔兽争霸",now());
insert into game(game_name,add_time) values("传奇世界",now());
(2)下载 mysql-connector-java-xx-bin.jar(驱动程序)
把 mysql-connector-java-5.1.20-bin.jar复制到~/java/apache-tomcat7/webapps/solr/WEB-INF/lib/目录下
cp mysql-connector-java-5.1.20-bin.jar ~/java/apache-tomcat7/webapps/solr/WEB-INF/lib/
(2)配置solrconfig.xml,添加一个requestHandler
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">game-data-config.xml</str>
</lst>
</requestHandler>
(3)新建一个数据源配置文件game-data-config.xml,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/game_db"
user="root"
password="123456"/>
<document name="doc">
<entity name="game" query="select * from game"
deltaImportQuery="select * from game where id='${dataimporter.delta.id}'"
deltaQuery="select id from game where add_time > '${dataimporter.last_index_time}'">
<field column="id" name="id" />
<field column="game_name" name="game_name" /><field column="add_time" name="add_time" />
</entity>
</document>
</dataConfig>
注: deltaImportQuery、deltaQuery:增量更新时用到,因为在schema.xml中已经有game_name和id字段了,只需在schmema.xml添加add_time字段,格式为date或者string。
在浏览器输入下面两个地址,导入数据创建索引。
更新全部: http://localhost:8080/solr/dataimport?command=full-import
增量更新: http://localhost:8080/solr/dataimport?command=delta-import
然后检测是否有数据:http://localhost:8080/solr/select/?q=*:*,现在页面上出现的就是你数据库里的数据了。
注:如果出现了下面异常:
Error loading class 'org.apache.solr.handler.dataimport.DataImportHandler
是solrconfig.xml文件中<lib dir="xx/dist/ regex="" /> dir的路径错了,改成你电脑上正确的位置就ok了~~
六. 配置多个实例
最后简单介绍一下如何配置多个实例,编辑$TOMCAT_HOME/solr/solr.xml
<cores adminPath="/admin/cores">
<core name="game" instanceDir="game" /> <core name="game2" instanceDir="game2" />
</cores>
此时访问的时候必须得在solr后加上各实例的名称
http://localhost:8080/solr/game/admin
http://localhost:8080/solr/game2/admin
发表评论
-
关于javac编译时出现“非法字符:\65279”的解决方法
2012-04-12 11:25 1917一些文本编辑软件在保存一个以UTF-8编码的文件时 ... -
UrlConnection连接和Socket连接的区别
2011-10-14 15:22 7152关于UrlConnection连接和Socket连接的区别,只 ... -
搜狗的一道关于加密解密的在线测评题目
2011-10-01 15:04 1612是一个信息编码的程序,阅读其encode部分,并补全其deco ... -
java实现快速排序
2011-09-08 11:00 1327/** * 快速排序 * @author zho ... -
java实现大数相乘
2011-09-08 10:41 3508计算大数:1234567891011121 ... -
java.util.ConcurrentModificationException 出现的原因和解决办法
2011-05-12 17:03 39329用iterator遍历集合时碰到java.util.Co ... -
Java:ArrayList和LinkedList区别
2011-02-15 16:30 1615一般大家都知道ArrayList ... -
java.lang.LinkageError: loader constraint violation: when resolving interface...
2010-10-06 22:12 2346java.lang.LinkageError: load ... -
JAVA多线程
2010-08-07 14:46 1067多线程 线程:是指进程中的一个执行流程。 线程与进程的区别 ... -
struts2常量详解
2010-06-11 08:55 1652struts2的配置文件之struts ... -
深入Java虚拟机:JVM中的Stack和Heap
2010-05-16 15:02 1102在JVM中,内存分为两个部分,Stack(栈)和Heap(堆) ... -
关于java的作用域protected
2010-05-10 19:54 1920在某个类中定义的protected 方法和属性和默认权限方法和 ... -
关于org.springframework.security.AccessDeniedException: Access is denied
2010-05-06 19:34 7775在做系统权限管理时使用了springsecurity,出现了如 ... -
struts2的struts.xml文件中package里的元素排列顺序
2010-04-22 09:52 1896package里元素必须按照一定的顺序排列,排列顺序如下: ... -
struts2自定义404错误页面
2010-04-21 17:50 5326以前做的一个网站,最近服务器后台出现一些异常,问题是客户访问一 ... -
hibernate的主键生成策略(generator)详解
2010-04-14 09:30 1783assigned” 主键由外 ... -
ssh开发关于struts2,action中方法执行两次的问题
2010-04-10 20:58 2345前段时间发现了一个很奇怪的问题,我的项目中关于action中的 ... -
org.hibernate.hql.ast.QuerySyntaxException: xx is not mapped [sql语句]
2010-04-08 10:06 2221今天一时大意,写了下面这条查询语句 final String ... -
Attempted a bean operation on a null object(tomcat5.0以上版本)
2010-03-24 21:45 1881今天做scwcd模拟题的时候,碰到这样一个题目: A serv ... -
解决struts2.1.6+spring2.0增加webservice错误
2010-03-24 14:16 1857由于要在项目中增加webservice,加入xfire后开始狂 ...
相关推荐
solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar solr-mongo-importer-1.1.0.jar
通过深入研究`solr-9.0.0-src.tgz`源码,开发者可以理解Solr的工作原理,定制自己的搜索解决方案,解决特定场景下的性能挑战,并为社区贡献新的功能和优化。同时,这也为学习和研究信息检索、全文搜索、分布式计算等...
1. **配置Solr服务器**:首先,将`apache-solr-dataimportscheduler-1.0.jar`添加到Solr服务器的`lib`目录下,确保服务器启动时能加载这个库。 2. **添加Scheduler配置**:在Solr的配置文件`solrconfig.xml`中,你...
solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-export-json最新代码solr-import-...
在"solr6--solr-dataimporthandler-scheduler-1.1"这个项目中,我们关注的重点是DIH的调度功能,也就是如何定期自动更新Solr索引。 DataImportHandler(DIH)是Solr的一个插件,用于从关系型数据库或其他结构化数据...
总之,"Solr-Resource-linux.rar"提供的资源涵盖了Linux环境下Solr的安装、配置、使用和维护,对于想在Linux服务器上部署Solr的开发者来说,是一份非常宝贵的参考资料。记得在实践中结合官方文档和社区资源,以便更...
标题中的"solr-8.11.1-src.tgz"表明这是Apache Solr 8.11.1版本的源代码包,适用于那些希望对Solr进行深度定制或开发的用户。 源代码发布通常包含了编译和构建Solr所需的所有文件,包括Java源代码、配置文件、测试...
在给定的压缩包“apache-solr-dataimporthandler-extras-1.4.0.jar.zip”中,主要包含了一个名为“apache-solr-dataimporthandler-extras-1.4.0.jar”的文件,这个文件是Solr的一个重要组件——DataImportHandler...
solr 增量更新所需要的包 solr-dataimporthandler-6.5.1 + solr-dataimporthandler-extras-6.5.1 + solr-data-import-scheduler-1.1.2
在使用时,我们需要将solr-dataimportscheduler-1.1.1.jar添加到Solr服务器的lib目录下,确保在启动时能够加载该插件。同时,还需要在Solr的配置文件中进行相应的设置,比如定义数据源、指定增量字段等,以指示插件...
这个工具的主要版本是"solr-mongo-importer-1.1",这表明它是1.1版,可能包含了对前一版本的改进和优化。 MongoDB是一个流行的NoSQL数据库系统,它以文档为中心,适合存储非结构化和半结构化的数据。而Solr是Apache...
solr自动更新包
solr-data-import-scheduler-1.1.2,用于solr定时更新索引的jar包,下载后引入到solr本身的dist下面,或者你tomcat项目下面的lib下面
solr-linux solr-linux solr-linux solr-linux solr-linux solr-linux solr-linux solr-linux solr-linux solr-linux
使用Solr-8.11.1时,你需要配置Solr实例,定义你的索引字段,创建和管理索引,然后通过HTTP请求进行查询。同时,你可以利用Solr的 faceting(分面搜索)、highlighting(高亮显示)、spell checking(拼写检查)等...
solr6.1.0版本jar已经不再提供读取自动索引配置文件路径的方法,因此apache-solr-dataimportscheduler-1.0内调用该方法的所有操作都无法实现。于是需要下载apache-solr-dataimportscheduler-1.0-with-source.jar并...
apache-solr-core-1.4.0.jar,apache-solr-core-1.4.0.jar
在使用Solr-9.0.0时,你需要根据业务需求创建或修改配置文件,如`solrconfig.xml`和`schema.xml`,定义索引的字段类型和字段。然后可以通过POST请求将数据导入Solr,Solr会自动进行分词、建立倒排索引等操作,从而...
标题中的 "solr-dataimportscheduler-1.1.jar" 指的是该插件的一个特定版本,即1.1版。这个 jar 包是将 Solr 与外部数据源集成并实现增量数据导入的关键组件。 Apache Solr 是一个流行的开源全文搜索引擎,广泛用于...
- 将 C:\solr-4.9.0\example\lib\ext 下的 JAR 文件复制到 C:\apache-tomcat-7.0.53\webapps\solr\WEB-INF\lib - 将 C:\solr-4.9.0\example\resources\log4j.properties 复制到 C:\apache-tomcat-7.0.53\webapps\...