全文检索技术---solr
1 Solr介绍
1.1 什么是solr
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr可以独立运行在Jetty、Tomcat等这些Servlet容器中。
Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
使用Solr 进行创建索引和搜索索引的实现方法很简单,如下:
l 创建索引:客户端(可以是浏览器可以是Java程序)用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr服务器根据xml文档添加、删除、更新索引 。
l 搜索索引:客户端(可以是浏览器可以是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的更多相关文章
- Lucene全文检索技术
Lucene全文检索技术 今日大纲 ● 搜索的概念.搜索引擎原理.倒排索引 ● 全文索引的概念 ● 使用Lucene对索引进行CRUD操作 ● Lucene常用API详解 ● ...
- 搜索技术---solr
solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式 ...
- 全文搜索技术—Solr
1. 学习计划 1. Solr的安装及配置 a) Solr整合tomcat b) Solr后台管理功能介绍 c) 配置中文分析器 2. 使用Solr的后台管理索引库 a) ...
- [摘]全文检索引擎Solr系列—–全文检索基本原理
原文链接--http://www.importnew.com/12707.html 全文检索引擎Solr系列—–全文检索基本原理 2014/08/18 | 分类: 基础技术, 教程 | 2 条评论 | ...
- (转)全文检索技术学习(一)——Lucene的介绍
http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得 ...
- 全文检索引擎 Solr 部署与基本原理
全文检索引擎 Solr 部署与基本原理 搜索引擎Solr环境搭建实例 关于 solr , schema.xml 的配置说明 全文检索引擎Solr系列-–全文检索基本原理 一.搜索引擎Solr环境搭建实 ...
- 全文检索引擎Solr 指南
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
- Lucene全文检索技术学习
---------------------------------------------------------------------------------------------------- ...
- 全文检索引擎Solr系列—–全文检索基本原理
场景:小时候我们都使用过新华字典,妈妈叫你翻开第38页,找到“坑爹”所在的位置,此时你会怎么查呢?毫无疑问,你的眼睛会从38页的第一个字开始从头至尾地扫描,直到找到“坑爹”二字为止.这种搜索方法叫做顺 ...
随机推荐
- 小程序真机GET请求出现406错误
问题:微信开发模拟器请求成功,获得数据,但是在真机上出现406请求错误,无法获得请求结果 原因:真机微信小程序的请求头与模拟器不同 怎么发现的:在请求头强制添加Accept即可解决 修复:在请求Hea ...
- linux shell 基础 使用日志与心得
linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现#!/bin/bash是指此脚本使用/bin/bash来解释执行.其中,#!是一个特殊的表示符,其后,跟着解释此脚 ...
- html 文本输入框效果大汇集
html 文本输入框效果大汇集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...
- java深入探究07-jdbc上
1.连接数据库三种方式 //连接数据库的URL private String url = "jdbc:mysql://localhost:3306/day17"; // jdbc协 ...
- 韩顺平Linux
shutdown -h now 立刻进行关机 shutdown -r now 立即重启 reboot同上. 用户登录尽量少用root账号登录,因为它是系统管理员,最大的管理权限,避免操作失误. 可以利 ...
- php深入浅出session
1. session概念 0 2. http协议与状态保持 0 3. 理解cookie 0 4. php中session的生成机制 2 5. php中session的过期回收机制 3 6. php中s ...
- codeforces 622D D. Optimal Number Permutation(找规律)
D. Optimal Number Permutation time limit per test 1 second memory limit per test 256 megabytes input ...
- visual studio 高级选项及配置
visual studio 是一款强大的 IDE,所谓 IDE 即是将通过命令行(一系列复杂的参数选项)编译.链接等操作内置到 IDE 的界面按钮处. 为什么新建的工程,可以直接 #include & ...
- 【二叉查找树】01不同的二叉查找树的个数【Unique Binary Search Trees】
当数组为1,2,3,4,...,n时,基于以下原则构建的BST树具有唯一性: 以i为根节点的树,其左子树由[1,i-1]构成,其右子树由[i+1, n]构成. 我们假定f(i)为以[1,i]能产生的U ...
- 跨平台的WebRTC客户端框架:OpenWebRTC
Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml WebRTC in WebKit : http://www.webrt ...