全文检索技术---solr
2017-07-02 22:29
260 查看
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也可以高效的完成站内搜索功能。
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) ; } } }
View Code
相关文章推荐
- 全文检索技术---solr
- solr全文检索技术学习(三)-搭建SolrCloud集群问题总结
- 全文检索技术-lucene,solr,nutch,hadoop,可见nutch除了做爬虫,还可以实现全文检索
- 全文检索技术—Solr
- 全文检索技术--solr
- solr全文检索(第一篇 安装测试)--源自技术
- solr全文检索技术学习(一)-核心配置文件solrconfig.xml
- solr全文检索(第二篇 solr的实例)--源自技术
- solr全文检索技术学习(二)-schema.xml配置解析
- solr全文检索(第三篇 数据导入)--源自技术
- 全文检索技术 solr(三)solr安装、启动
- Solr全文检索服务器搭建
- 全文检索引擎 Solr 部署与基本原理
- oracle 全文检索技术
- 全文检索引擎Solr系列—–全文检索基本原理
- 全文检索技术学习(一)——Lucene的介绍
- 全文检索引擎Solr系列——整合MySQL、MongoDB
- Solr全文检索服务器搭建与基本使用介绍
- Solr_全文检索引擎系统
- 全文检索solr