Solr/Lucene采用的是一种反向索引,所谓反向索引:就是从关键字到文档的映射过程,保存这种映射这种信息的索引称为反向索引。
Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。
Solr是一个基于Lucene的全文搜索引擎,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,实现了可配置、可扩展并对查询性能进行了优化,更灵活的配置,更高的查询效率。支持 XML/HTTP协议 ;支持 JSON API 接口;支持缓存、复制;同时具有完善的Web管理界面,是一款非常优秀的全文搜索引擎。
Solr对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML/JSON文件,生成索引;也可以通过Http Get操作执行查询请求,并以XML/JSON格式的返回结果。
Solr的特性包括:
1.强大的全文搜索功能。
2.专为高通量的网络流量进行的优化。
3.基于开放接口(XML和HTTP)的标准。4.综合的HTML管理界面。
5.可伸缩性-能够有效地复制到另外一个Solr搜索服务器。
6.使用XML配置达到灵活性和适配性。
7.可扩展的插件体系。
8.
高亮功能;
9. 数据库整合;
10. 高可靠性、伸缩性和容错能力。提供分布式索引,复制,和负载平衡的查询。自动故障转移和恢复,易于配置等;
Solr的使用步骤:
1>Solr的安装:
服务器需要提前配置好
JAVA
运行环境.
2>下载solr
3>解压缩
tar -xvf solr-5.5.4.tgz -C /usr/local
4>启动
cd /usr/local/solr/bin
./solr start //
启动
5>访问控制台
Jetty
服务的默认服务端口是
8983
,此刻访问你的
http://IP:8983 ,
你应该可以看到
Solr
的控制面板了。
访问
8983
端口 连接失败,原因可能有两个:
1. Jetty
服务(
Solr
服务)没有启动,启动即可,可以通过命令查看
Solr
的当前状态
2.
防火墙程序的拦截,把防火墙关闭
:
Cetos7
:
systemctl stop firewalld
Centos6:
service iptables stop
solr配置:
1>
准备创建
core
的配置文件
core
是
solr
的特有概念,每个
core
是一个查询数据
,
索引等的集合体,你可以把它想象成一个独立数据库,我们创建一个新
core
:
1
、在
/usr/local/solr/server/solr
子目录下面建立一个新文件夹,命名为
collection1
,这个是
core
的名称:
mkdir /usr/local/solr/server/solr/collection1
2
、把
/usr/local/solr/server/solr/configsets/data_driven_schema_configs/conf
下面的所有文件全部拷贝到我们创建的
conf
目录中
cp -R /usr/local/solr/server/solr/configsets/data_driven_schema_configs/conf /usr/local/solr/server/solr/collection1/conf
3、
把目录
/usr/local/solr/example/example-DIH/solr/db/conf
下面的
admin-extra.html
、
admin-extra.menu-bottom.html
、
admin-extra.menu-top.html
三个
html
文件复制到目录
/usr/local/solr/server/solr/collection1/conf
cp -r /usr/local/solr/example/example-DIH/solr/db/conf/admin*.html /usr/local/solr/server/solr/collection1/conf
4
、修改
/usr/local/solr/server/solr/collection1/conf
目录下的
solrconfig.xml
增加内容如下:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
|
requestHandler
请求处理器,定义了索引和搜索的访问方式。
通过
/dataimport
进行数据导入,可以完成从
MYSQL
数据库导入数据到
Solr
的操作。
data-config.xml
文件是自己制定的数据源描述文件,名字可以随便取。
6、/usr/local/solr/server/solr/collection1/conf
目录下新建
data-config.xml
7、
修改
/usr/local/solr/server/solr/collection1/conf
目录下
managed-schema
文件中添加如下内容:
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price" type="float" indexed="true" stored="true"/>
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
|
field
配置参数说明
:
l Name
:域的名称
l Type
:域的类型
l Indexed
:是否索引
l Stored
:是否存储
l multiValued
:是否是多值,存储多个值时设置为
true
,
solr
允许一个
Field
存储多个值,比如存储一个用户的好友
id
(多个),商品的图片(多个,大图和小图)
copyField
(复制域)
:
可以将多个
Field
复制到一个
Field
中,以便进行统一的检索。当创建索引时,
solr
服务器会自动的将源域的内容复制到目标域中。
l source
:源域
l dest
:目标域,搜索时,指定目标域为默认搜索域,可以提供查询效率。
第二步:安装中文分词
因为
solr
虽然内置中文分词,但效果并不好,我们需要添加
IKAnalyzer
中文分词引擎来查询中文。在
https://github.com/EugenePig/ik-analyzer-solr5
下载
IKAnalyzer for solr5
的源码包,然后使用
Maven
编译,得到一个文件
IKAnalyzer-5.0.jar
,把它放入
/usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib
目录中,然后在
managed-schema
的最后加入以下内容:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
|
保存后,
core
的配置就算完成了。
上传相关类库:
要导入
mysql
数据,需要
MYSQL
类库:
mysql-connector-java-bin.jar
库文件,
连同
solr/dist
目录下面的
solr-dataimporthandler-5.5.0.jar
,
solr-dataimporthandler-extras-5.5.0.jar
两个文件,全部拷贝到
/usr/local/solr/server/solr-webapp/webapp/WEB-INF/lib
目录中,然后重启
solr
,就可以开始数据导入工作了。
重启
Solr ./solr restart
第三步:创建
Core
1、
登录
点击
Add Core
,没有错误,表示创建成功!
第四步:导入数据:
相应的数据库脚本:
0512_products.sql
,先把
MYsql
数据库准备好
q -
查询关键字
,必须的,如果查询所有使用
*:*
fq-
(
filter query
)过虑查询
,作用:在
q
查询符合结果中同时是
fq
查询符合的
比如:过滤查询价格从
1
到
20
的记录。也可以在“
q
”查询条件中使用
product_price:[1 TO 20]
也可以使用
“
*
”表示无限,例如:
20
以上:
product_price:[20 TO *]
20
以下:
product_price:[* TO 20]
sort -
排序
,格式:
sort=<fieldname>+<desc|asc>[,<field name>+<desc|asc>]
… 。
示例:
product_price desc
按照价格从高到低进行排序
product_price asc
按照价格从低到高进行排序
fl -
指定返回那些字段内容
,用逗号或空格分隔多个,不写默认返回全部配置的。
df-
指定一个默认搜索
Field
,如果
q
查询关键字未指定搜索字段,就用默认搜索字段
wt - (writer type)
指定输出格式,
可以有
xml, json, csv, python, php
等格式
hl
是否高亮
,
设置高亮
Field
,设置格式前缀和后缀。
准备相关
JAR
包
MAVEN
依赖
<
dependency
>
<
groupId
>
org.apache.solr
</
groupId
>
<
artifactId
>
solr
-
solrj
</
artifactId
>
<
version
>
5.5.4
</
version
>
</
dependency
>
|
编写
JAVA
调用创建文档程序
/**
*
增加文档
*
*
@throws
Exception
*/
public
static
void
create()
throws
Exception {
String
URL
=
"http://192.168.1.116:8983/solr/collection1"
;
HttpSolrClient
server
=
new
HttpSolrClient(
URL
);
//
创建数据
SolrInputDocument
doc
=
new
SolrInputDocument();
doc
.addField(
"id"
,
"5001"
);
doc
.addField(
"product_catalog_name"
,
"
幽默杂货
"
);
doc
.addField(
"product_price"
,
"28.8"
);
doc
.addField(
"product_name"
,
"
幸福一家人彩色金属门后挂
"
);
doc
.addField(
"product_picture"
,
"2014032612461139.png"
);
server
.add(
doc
);
server
.commit();
}
|
3
、编写
JAVA
调用检索文档程序
/**
*
检索文档
*
*
@throws
Exception
*/
public
static
void
query()
throws
Exception {
String
URL
=
"http://192.168.1.116:8983/solr/collection1"
;
HttpSolrClient
server
=
new
HttpSolrClient(
URL
);
//
定义查询内容
(列名
:
关键字)
SolrQuery
query
=
new
SolrQuery(
"product_name:
幸福
"
);
//
定义查询内容
query
.setStart(0);
//
起始游标位置
query
.setRows(10);
//
返回的结果集数量
QueryResponse
rsp
=
server
.query(
query
);
SolrDocumentList
results
=
rsp
.getResults();
System.
out
.println(
results
.getNumFound()
);
//
查询总条数
for
(SolrDocument
doc
:
results
) {
System.
out
.println(
doc
);
}
}
|
使用
Solr
实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序。
1、
配置
springmvc.xml
关键配置和
Solr
核心调用地址:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc
=
"http://www.springframework.org/schema/mvc"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
xmlns:tx
=
"http://www.springframework.org/schema/tx"
xsi:schemaLocation
=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd"
>
<!--
配置扫描 器
-->
<
context:component-scan
base-package
=
"com.offcn"
/>
<!--
配置处理器映射器 适配器
-->
<
mvc:annotation-driven
/>
<!--
配置视图解释器
jsp
-->
<
bean
id
=
"jspViewResolver"
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<
property
name
=
"prefix"
value
=
"/WEB-INF/jsp/"
/>
<
property
name
=
"suffix"
value
=
".jsp"
/>
</
bean
>
<!--
初始化
sorl
Server
对象
-->
<
bean
id
=
"solrServer"
class
=
"
org.apache.solr.client.solrj.impl.HttpSolrClient
"
>
<
constructor-arg
index
=
"0"
value
=
"http://10.0.0.234:8983/solr/collection1"
/>
</
bean
>
</
beans
>
|
1、
配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>jdsearch</display-name>
<welcome-file-list>
<welcome-file>list.action</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- POST
提交过滤器
UTF-8 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
前端控制器
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
|