Solr介绍

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值