http://docs.spring.io/spring-data/solr/

首先介绍一下solr:

Apache Solr (读音: SOLer) 是一个开源、高性能、采用Java开发、基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现。Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件(schema.xml)中使用:id进行描述。solr有两个核心文件,solrconfig.xml和schema.xml。solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等;schema.xml配置映射了各种数据类型的索引方案,分词器的配置、索引文档中包含的字段也在此配置。

工作中主要用来分词和搜索,简单的工作原理是:利用分词器对数据源进行分词处理,然后根据分词结果建立索引库;查询的时候,利用分词器对查询语句进行分词,根据查询语句分词的结果在索引库中进行匹配,最后返回结果。

废话少说,下面开始solr之旅吧:

一.安装JDK和Tomcat

(1):安装jdk  下载jdk安装包,解压到jdk-1.x目录

(2):安装tomcat,下载tomcat安装包,解压到apache-tomcat目录下

修改tomcat安装目录下的conf目录的server.xml

找到,加入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内容如下:

然后在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,把注释掉或者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

在当前目录下新建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

注:下面的代码中多了很多“”标签,这个是设置字体时iteye编辑器自己生成的。

Xml代码  

添加一个索引字段field,并应用上面配置的fieldtype

Java代码  

然后找到这一句:text把它改成game_name

IKAnalyzer添加自定义分词词典:词典文件格式为无BOM的UTF-8编码的文本文件,文件扩展名不限,一次可以添加多个词库,每个词库以";"分开。把IKAnalyzer目录下的IKAnalyzer.cfg.xml和stopword.dic拷贝到$TOMCAT_HOME/webapps/solr/WEB_INF/classes目录下,可以自己新建一个mydic.dic文件,然后在IKAnalyzer.cfg.xml里进行配置。

(2)安装mmseg4j

在当前目录下新建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

Xml代码  

注意:dicPath的值改成你自己机器上相应的目录。

然后修改之前添加的filed,让其使用mmseg4j分词器

Xml代码  

配置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,是自定义词库文件

现在,这两种分词方法都已配置好了,想用哪种就把查询的filed的type设置成哪种。

四. 导入文档数据

现在添加文本搜索的功能,首先导入数据源。

切换到/home/zhoujh/java/solr/apache-solr/example/exampledocs目录下,该目录下有很多xml文件,随便copy一个,改名位game_data.xml。如:cp hd.xml game_data.xml,修改内容如下:

Xml代码  

1

魔兽世界

2

仙剑

3

传奇

4

极品飞车

5

轩辕剑

注意:该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..

Xml代码  

0

0

on

0

*:*

10

2.2

魔兽世界

1

仙剑

2

传奇

3

极品飞车

4

轩辕剑

5

不过在现实工作中,一般利用数据库作为数据源,下面我们来配置solr连接数据库源。

五. solr从数据库导入数据

(1)安装mysql,

安装完后执行以下命令:启动mysql服务,进入mysql,创建数据库kw_game,创建表game,导入数据

Sql代码  

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

Xml代码  

game-data-config.xml

(3)新建一个数据源配置文件game-data-config.xml,内容如下

Java代码  

driver="com.mysql.jdbc.Driver"

url="jdbc:mysql://localhost:3306/game_db"

user="root"

password="123456"/>

deltaImportQuery="select * from game where id='${dataimporter.delta.id}'"

deltaQuery="select id from game where add_time > '${dataimporter.last_index_time}'">

注: 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文件中 dir的路径错了,改成你电脑上正确的位置就ok了~~

六. 配置多个实例

最后简单介绍一下如何配置多个实例,编辑$TOMCAT_HOME/solr/solr.xml

Xml代码  

此时访问的时候必须得在solr后加上各实例的名称

http://localhost:8080/solr/game/admin

http://localhost:8080/solr/game2/admin

java全文搜索服务器 solr_Apache Solr采用Java开发、基于Lucene的全文搜索服务器相关推荐

  1. 一种基于Lucene的实时搜索方案|淘宝技术部

    背景 阿里集团各大业务快速发展过程中都对搜索服务很多刚性的需要,而这样的搜索需求有着非常明显的特征:快速支持.低成本.实时性和稳定性. 快速支持: 业务需求急迫.需要一周甚至几天内完成索引服务搭建.测 ...

  2. java设计一个查询模块_采用Java实现的汉语拼音查询模块

    0引言现有管理信息系统的数据库中存储了大量的中文信息,中文信息的检索是MIS的重要功能,对于中文字段的常见查询方法是输入汉字字符串,但是此方法需要过多的击键次数,例如,查询人名为"王晓明&q ...

  3. 基于 Lucene 的桌面文件搜索

    开源2010年,自己在学习 Lucene 时开发的一款桌面文件搜索工具,这么多年过去了,代码一直静静存放在自己的硬盘上,与其让其沉睡,不如分享出来. 这款工具带有明显的模仿 Everything 的痕 ...

  4. [Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

    一.前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程.该工程是基于nodejs和redis写成的一个简单的工 ...

  5. java简单的文本编辑器_采用java语言如何建立一个简单的文本编辑器

    1.类的框架: 所谓类的框架,就是给出这个类需要的属性和方法,比如本文就需要我们的类继承JFrame父类和载入ActionListener接口,属性有按钮,面板,文本区域框,方法构造方法与事件处理方法 ...

  6. sql附加服务器数据库文件夹,快速开发平台企业版--后台SqlServer更换服务器,可以用数据库分离与附加方法重新启动...

    这个方法涉及到SQL Server分离数据库和附加数据库这两个互逆操作工具. 1.分离数据库就是将某个数据库(如student_Mis)从SQL Server数据库列表中删除,使其不再被SQL Ser ...

  7. 我应该采用 Java 12 还是坚持使用 Java 11?

    编译自https://blog.joda.org/2018/10/adopt-java-12-or-stick-on-11.html 原文作者 Stephen Colebourne 是一名 Java ...

  8. 全文收索服务-solr介绍

    Solr是基于Lucene的全文收索服务器.提供分布式索引,负载均衡的查询.自动故障转义和恢复功能 solr提供标准的Rest API,任何编程语言都可以试用 下载: http://mirror.bi ...

  9. 【Java基础系列教程】第二章 Java语言概述、配置环境变量

    一.计算机编程语言概述 1.1 语言 语言(英文:Language)是人类进行沟通交流的表达方式.例如:中国人与中国人用普通话沟通.而中国人要和英国人交流,就要学习英语.              语 ...

最新文章

  1. SAP MM T-code MD04的使用,是有前提的!
  2. Ubuntu中apache+php+sql搭建/卸载
  3. UNITY3D与iOS交互解决方案
  4. linux 文件的组织,Linux文件组织和目录结构
  5. ubuntu 安装java jdk_「ubuntu安装jdk」Ubuntu安装jdk8的两种方式 - seo实验室
  6. java应用中的日志介绍
  7. Qml学习笔记-Repeater的基本使用
  8. linux命令之ln 命令
  9. ubuntu/centos Server 安装完成后,开启SSH,配置IP地址,DNS
  10. java file文件删除_Java File.delete 删除文件
  11. 中医预约挂号系统,代煎取药功能原来这样用?
  12. 【爬虫进阶】验证码处理:打码平台的使用(反反爬)
  13. 支付宝支付php开发demo下载地址,tp使用支付宝接口demo
  14. 分布式操作系统 - 4.分布式通信管理
  15. 依次计算一系列给定字符串的字母值,字母值为字符串中每个字母对应的编号值(A对应1,B对应2,以此类推,不区分大小写字母,非字母字符对应的值为0)的总和
  16. Burp Proxy
  17. MIT 18.01 Single Variable Calculus(单变量微积分)课堂笔记【3】——求导四则运算和三角函数求导
  18. 取石子c语言,取石子(一)(C语言)
  19. 聊聊程序员如何用技术变现?
  20. 专升本高数学习总结——无穷级数

热门文章

  1. Mathtype如何打出偏导、一撇
  2. 尝试在数据库 7 中提取逻辑页 (1:3790083) 失败。该逻辑页属于分配单元 720575940
  3. 数字旋转方阵问题-分治法
  4. Angular-路由
  5. 使用CCProxy搭建部署linux centos7内网代理上网
  6. 基于图数据的研报词关联之聚合分析
  7. 数字化契约如何守护?解析聚合签名的妙用
  8. “云聚赣鄱,智领未来”——懂行中国行暨华为云城市峰会2021 • 江西数字峰会成功举办...
  9. qq飞车手游服务器找不到了,QQ飞车手游拉取服务器失败怎么办 拉去服务器失败解决办法...
  10. 在线考试系统需要解决的主要问题有哪些