1       Solr介绍

1.1   什么是solr

Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。

Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化

使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:

创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。

搜索索引:客户端(可以是浏览器可以是Java程序)用 GET方法向 Solr 服务器发送请求,然后对 Solr服务器返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建页面UI的功能,但是Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况

1.2   Solr和Lucene的区别

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索应用。Lucene仅提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索应用。

Solr的目标是打造一款企业级的搜索引擎系统,它是基于Lucene一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

                

2      Solr安装配置

  2.1   SolrCore配置

    2.1.1  SolrHome和SolrCore

SolrHome是Solr运行的主目录,该目录中包括了多个SolrCore目录。SolrCore目录中包含了运行Solr实例所有的配置文件和数据文件,Solr实例就是SolrCore

一个SolrHome可以包括多个SolrCore(Solr实例),每个SolrCore提供单独的搜索和索引服务。

2.1.2  目录结构

  SolrHome目录:

    

      SolrCore目录:

        

2.1.2  创建SolrCore

创建SolrCore先要创建SolrHome。在solr解压包下solr-4.10.3\example\solr文件夹就是一个标准的SolrHome。

l  拷贝solr解压包下solr-4.10.3\example\solr文件夹。

      

    l  复制该文件夹到本地的一个目录,把文件名称改为mySolrHome。

注:改名不是必须的,只是为了便于理解

        

进入此目录

  

      

        SolrCore创建成功。

  

2.1.3  配置SolrCore

在conf文件夹下有一个solrconfig.xml。这个文件是来配置SolrCore实例的相关信息。如果使用默认配置可以不用做任何修改。它里面包含了不少标签,但是我们关注的标签为:lib标签、datadir标签、requestHandler标签

2.1.4       lib 标签

将contrib和dist两个目录拷贝到mySolrHome目录下;

在solrconfig.xml中可以加载一些扩展的jar,solr.install.dir表示solrCore的目录位置,需要如下修改:

        

注意:把../..改为自己jar包存放的路径,才可以找到相关jar包。也可以配置相对路径:

2.2       datadir标签

      每个SolrCore都有自己的索引文件目录 ,默认在SolrCore目录下的data中。

                

data数据目录下包括了index索引目录 和tlog日志文件目录。

如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,如下:

      

  

2.3       requestHandler标签

requestHandler请求处理器,定义了索引和搜索的访问方式。

通过/update维护索引,可以完成索引的添加、修改、删除操作。

提交xml、json数据完成索引维护,索引维护小节详细介绍。

通过/select搜索索引。

设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:

<requestHandler name="/select" class="solr.SearchHandler">

<!-- 设置默认的参数值,可以在请求地址中修改这些参数-->

<lst name="defaults">

<str name="echoParams">explicit</str>

<int name="rows">10</int><!--显示数量-->

<str name="wt">json</str><!--显示格式-->

<str name="df">text</str><!--默认搜索字段-->

</lst>

</requestHandler>

3   Solr工程部署

    由于在项目中用到的web服务器大多数是用的Tomcat,所以就讲solr和Tomcat的整合。

  3.1  安装Tomcat

      

    

3.2  把solr.war部署到Tomcat中

  1、  从solr解压包下的solr-4.10.3\example\webapps目录中拷贝solr.war

    

    

3.3  添加solr服务的扩展依赖包(日志包)

  l  把solr解压包下的solr-4.10.3\example\lib\ext目录下的所有jar包拷贝。

  l  复制到解压缩后的solr工程的WEB-INF\lib目录

3.4  添加log4j.properties

  1、  把solr解压包下solr-4.10.3\example\resources\log4j.properties文件进行拷贝

  2、  在解压缩后的solr工程中的WEB-INF目录中创建classes文件夹

    3、  复制log4j.properties文件到刚创建的classes目录

3.5  在solr应用的web.xml文件中,加载SolrHome

修改web.xml使用jndi的方式告诉solr服务器。

Solr/home名称必须是固定的。

4 启动Tomcat进行访问

先启动部署了solr项目的tomcat服务器,再访问http://localhost:8080/solr/

出现以下界面则说明solr安装成功!!!

5      Solrj的使用

    5.1   什么是solrj

      solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

        

                  Solrj和图形界面操作的区别就类似于数据库中你使用jdbc和mysql客户端的区别一样。

代码示例:

    

1  添加jar

        

 package cn.xjy.test ;

 import java.io.IOException ;
import java.util.List ;
import java.util.Map ;
import org.apache.solr.client.solrj.SolrQuery ;
import org.apache.solr.client.solrj.SolrQuery.ORDER ;
import org.apache.solr.client.solrj.SolrServer ;
import org.apache.solr.client.solrj.impl.HttpSolrServer ;
import org.apache.solr.client.solrj.response.QueryResponse ;
import org.apache.solr.common.SolrDocument ;
import org.apache.solr.common.SolrDocumentList ;
import org.apache.solr.common.SolrInputDocument ;
import org.junit.Before ;
import org.junit.Test ; public class TestSolrJ { SolrServer solrServer = null ; @Before
public void init() {
// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
solrServer = new HttpSolrServer("http://localhost:8080/solr/collection2") ;
} /**
* 更新或添加
* 存在就更新,不存在就添加(根据id判断)
* @throws Exception
* @throws IOException
*/
@Test
public void testAddandUpdate() throws Exception, IOException { // 2、 创建SolrInputDocument对象,然后通过它来添加域。
SolrInputDocument doc = new SolrInputDocument() ; /* 测试添加 */
/* doc.addField("id","测试1"); doc.addField("product_name","测试name");
* doc.addField("product_catalog_name","测试product_catalog_name");
* doc.addField("product_price",22f);
* doc.addField("product_description","测试product_description");
* doc.addField("product_picture","测试product_picture"); */ /* 测试更新 */ // 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
// 第二个参数:域的值
// 注意:id的域不能少
doc.addField("id", "测试1") ;
doc.addField("product_name", "测试更新name") ;
doc.addField("product_catalog_name", "测试更新product_catalog_name") ;
doc.addField("product_price", 23f) ;
doc.addField("product_description", "测试更新product_description") ;
doc.addField("product_picture", "测试更新product_picture") ; // 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
solrServer.add(doc) ; // 4、 提交。
solrServer.commit() ;
} /**
* 删除索引
* @throws Exception
*/
@Test
public void testDelete() throws Exception {
// 根据id删除
/* solrServer.deleteById("测试1") ; solrServer.commit(); */ // 根据条件删除
solrServer.deleteByQuery("product_price:23") ; // 全部删除
// solrServer.deleteByQuery("*:*");
solrServer.commit() ;
} /**
* 简单查询
* @throws Exception
*/
@Test
public void testSimpleQuery() throws Exception { SolrQuery query = new SolrQuery() ;
// q是固定的且必须 的
query.set("q", "id:测试1") ;
query.set("fl", "id,product_catalog_name") ;
// query.setFields("id", "product_catalog_name");//效果同上 QueryResponse queryResponse = solrServer.query(query) ; SolrDocumentList results = queryResponse.getResults() ; System.out.println("总数:" + results.getNumFound()) ; for (SolrDocument solrDocument : results) {
// System.out.println(solrDocument.get("id")) ;
System.out.println(solrDocument) ;
}
} /**
* 复杂查询
* @throws Exception
*/
@Test
public void testComplexQuery() throws Exception {
SolrServer solrServer2 = new HttpSolrServer("http://localhost:8080/solr") ; SolrQuery query = new SolrQuery() ; // 查询条件
query.setQuery("product_catalog_name:幽默杂货") ; // 过滤条件
query.setFilterQueries("product_catalog_name:幽默杂货") ; // 按指定字段排序
query.setSort("id", ORDER.desc) ; // 分页
query.setStart(0) ;
query.setRows(100) ; // 设置要显示的字段
// query.setFields("id,product_catalog_name") ; // 设置默认搜索域
// query.set("df", "product_name"); // 给特定字段设置样式,要显示样式的字段必须是查询条件中的字段
query.setHighlight(true) ;
query.addHighlightField("product_catalog_name") ;
query.setHighlightSimplePre("<span color='red'>") ;
query.setHighlightSimplePost("</sapn>") ; // 查询
QueryResponse queryResponse = solrServer2.query(query) ; // 获得结果集
SolrDocumentList results = queryResponse.getResults() ; System.out.println("总数:" + results.getNumFound()) ; // 遍历结果集
for (SolrDocument solrDocument : results) {
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting() ;
System.out.println(highlighting.get(solrDocument.get("id"))) ;
System.out.println(solrDocument) ;
}
}
}

全文检索技术---solr的更多相关文章

  1. Lucene全文检索技术

    Lucene全文检索技术 今日大纲 ●    搜索的概念.搜索引擎原理.倒排索引 ●    全文索引的概念 ●    使用Lucene对索引进行CRUD操作 ●    Lucene常用API详解 ●  ...

  2. 搜索技术---solr

    solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式 ...

  3. 全文搜索技术—Solr

    1.   学习计划 1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器 2. 使用Solr的后台管理索引库 a)     ...

  4. [摘]全文检索引擎Solr系列—–全文检索基本原理

    原文链接--http://www.importnew.com/12707.html 全文检索引擎Solr系列—–全文检索基本原理 2014/08/18 | 分类: 基础技术, 教程 | 2 条评论 | ...

  5. (转)全文检索技术学习(一)——Lucene的介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得 ...

  6. 全文检索引擎 Solr 部署与基本原理

    全文检索引擎 Solr 部署与基本原理 搜索引擎Solr环境搭建实例 关于 solr , schema.xml 的配置说明 全文检索引擎Solr系列-–全文检索基本原理 一.搜索引擎Solr环境搭建实 ...

  7. 全文检索引擎Solr 指南

    全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T

  8. Lucene全文检索技术学习

    ---------------------------------------------------------------------------------------------------- ...

  9. 全文检索引擎Solr系列—–全文检索基本原理

    场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...

随机推荐

  1. 2018年长沙理工大学第十三届程序设计竞赛 C 取手机 【概率】

    链接:https://www.nowcoder.com/acm/contest/96/C 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  2. 事件监听机制——列出指定目录内容、添加Dialog对话框

    事件监听机制理解与Dialog练习 利用Java语言,仿照我的电脑目录进行打开目录,输入文件路径,查看该路径下所有的文件,设置两个文本框,一个转到按钮,当点击转到按钮时,查看路径是否正确,若正确在第二 ...

  3. 狄利克雷卷积&莫比乌斯反演

    昨天刚说完不搞数论了,刚看到一个\(gcd\)的题目dalao用这个做了,虽然比正解麻烦,还是打算学一学了 数论函数: 数论函数的定义: 数论函数亦称算术函数,一类重要的函数,指定义在正整数集上的实值 ...

  4. Eclipse输入命令行参数

    想要在Eclipse中输入命令行参数,可以在目录中该程序上右键,选择“Run As",选择”Run configurations",如图: 然后输入命令行参数: 点击Apply和R ...

  5. POJ 3928 Ping pong(树状数组+两次)

    题意:每个人都有一个独特的排名(数字大小)与独特的位置(从前往后一条线上),求满足排名在两者之间并且位置也在两者之间的三元组的个数 思路:单去枚举哪些数字在两者之间只能用O(n^3)时间太高,但是可以 ...

  6. 四分位数及matlab实现

    四分位数(quantile),解释及调用形式如下. quantile(x,y,z)的三个参数的说明如下:x表示要求的矩阵或者向量:y的取值为表示要求的分位数,如四分之一中位数0.25,四分之三中位数0 ...

  7. HTML5 学习记录——0

    2015/08/19 HTML5的标签功能划分:基础.格式.表单.框架.图像.音视频.链接.列表.表格.样式.元信息.编程 1.HTML基础标题 <h1> - <h6>段落 & ...

  8. 创建第一个Servlet并定制Sevlet模板

    我们已经为eclipse配好了Tomcat服务器,创建了Web工程,现在是时候该创建一个Servlet向世界问好了! 第一步:创建一个Web工程,选中”src“文件夹 -->单击右键,鼠标移到” ...

  9. 7_DoubleBuffer 游戏编程中的双缓存模式

    ### double buffer 双缓存 简单说: 当一个缓存被读取的时候,往另一个缓存里写入, 如此交替 #### the pattern 有两个缓存实例,一个是 current buffer, ...

  10. L1-039 古风排版(20 分)

    中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数.第二行给出一个长度不超过1000的非空 ...