什么是Solr呢?
Solr是Apache下的一个*开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr索引的实现方法很简单,用POST方法向Solr服务器发送一个描述Field及其内容的XML文档,Solr根据XML文档添加、删除、更新索引。
Solr搜索只需要发送HTTP GET请求,然后对Solr返回XML、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理页面,通过管理界面可以查询Solr的配置和运行情况。
Solr的安装配置
从Solr官方网站(http://lucene.apache.org/solr/)下载Solr,具体版本可自行选择。
例如:下载Solr 4.10.3,根据Solr的运行环境,Linux下需要下载lucene-4.10.3.tgz,Windows下需要下载lucene-4.10.3.zip。
Solr使用教程可参考:htttps://www.w3cschool.cn/solr doc/solr_doc
什么是SolrJ?
SolrJ是访问Solr服务的Java客户端,提供索引和搜索的请求方法,SolrJ通常是嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
创建索引:使用SolrJ创建索引,通过调用SolrJtigongdeAPI请求Solr服务,Document通过SolrInputDocument进行构建。
1 public void testCreateIndex() throws SolrServerException,IOException { 2 SolrServer solrServer = new HttpSolrServer(urlString); 3 SolrInputDocument document = new SolrInputDocument(); 4 document.addField("id", "c0001"); 5 document.addField("product_name", "solr全文检索");//商品名称 6 document.addField("product_price",86.5f);//商品价格 7 document.addField("product_picture","382782828.jpg");//商品图片 8 document.addField("product_description", "这是一本关于solr的书籍!");//商品描述 9 document.addField("product_catalog_name","javabook");//商品分类 10 UpdateResponse response =solrServer.add(document); 11 solrServer.commit();// 提交 12 }
删除索引:
1 public void testDeleteIndex() throws SolrServerException,IOException { 2 SolrServer solrServer = new HttpSolrServer(urlString); 3 UpdateResponse response = solrServer.deleteById("c0001"); //根据id删除 4 // solrServer.deleteById(ids); //根据多个id删除 5 //solrServer.deleteByQuery("id:100 id:101"); //自动查询条件删除 6 solrServer.commit();// 提交 7 }
搜索索引:
1 public void testSearch() throws SolrServerException { 2 SolrServer solr = new HttpSolrServer(urlString); 3 SolrQuery query = new SolrQuery(); // 查询对象 4 //设置查询条件,名称“q”是固定的且必须的 5 //搜索product_keywords域,product_keywords是复制域包括product_name和 product_description 6 query.set("q", "product_keywords:java教程"); 7 query.addSort("product_price", ORDER.desc); //// 查询结果按照价格降序排序 8 QueryResponse response = solr.query(query); // 请求查询 9 SolrDocumentList docs = response.getResults(); // 查询结果 10 // 查询文档总数 11 System.out.println("查询文档总数" +docs.getNumFound()); 12 for (SolrDocument doc : docs) { 13 String id = (String) doc.getFieldValue("id"); //商品主键 14 String product_name = (String)doc.getFieldValue("product_name"); //商品名称 15 Float product_price = (Float)doc.getFieldValue("product_price"); //商品价格 16 String product_picture = (String)doc.getFieldValue("product_picture"); //商品图片 17 String product_catalog_name = (String)doc.getFieldValue("product_catalog_name"); //商品分类 18 19 System.out.println(id); 20 System.out.println(product_name); 21 System.out.println(product_price); 22 System.out.println(product_picture); 23 System.out.println(product_catalog_name); 24 } 25 }
分页、高亮:
1 public void testSearch3() throws SolrServerException { 2 SolrServer solr = new HttpSolrServer(urlString); 3 SolrQuery query = new SolrQuery(); // 查询对象 4 query.setQuery("product_keywords:透明挂钩 "); // 设置商品分类、关键字查询 5 6 int pageSize = 2; // 分页参数,每页显示记录数 7 int curPage = 2; // 当前页码 8 int begin = pageSize * (curPage - 1); // 开始记录下标 9 query.setStart(begin); // 起始下标 10 query.setRows(pageSize); // 结束下标 11 // 设置高亮参数 12 query.setHighlight(true); // 开启高亮组件 13 query.addHighlightField("product_name");// 高亮字段 14 query.setHighlightSimplePre("<span color='red'>");//前缀标记 15 query.setHighlightSimplePost("</span>");// 后缀标记 16 17 QueryResponse response = solr.query(query); // 请求查询 18 SolrDocumentList docs = response.getResults(); // 查询结果 19 // 查询文档总数 20 System.out.println("查询文档总数" +docs.getNumFound()); 21 for (SolrDocument doc : docs) { 22 String id = (String) doc.getFieldValue("id"); // 商品主键 23 String product_name = (String)doc.getFieldValue("product_name"); // 商品名称 24 Float product_price = (Float)doc.getFieldValue("product_price"); // 商品价格 25 String product_picture = (String) doc.getFieldValue("product_picture"); // 商品图片 26 String product_catalog_name = (String) doc.getFieldValue("product_catalog_name"); // 商品分类 27 28 System.out.println("id=" + id); 29 System.out.println("product_name=" +product_name); 30 System.out.println("product_price=" +product_price); 31 System.out.println("product_picture=" +product_picture); 32 System.out.println("product_catalog_name=" +product_catalog_name); 33 // 高亮信息 34 if (response.getHighlighting() != null) { 35 if (response.getHighlighting().get(id) !=null) { 36 Map<String, List<String>> map =response.getHighlighting().get(id);// 取出高亮片段 37 if (map.get("product_name") !=null) { 38 for (String s :map.get("product_name")) { 39 System.out.println(s); 40 } 41 } 42 } 43 } 44 } 45 }
Solr搜索
1 <requestHandler name="/select" class="solr.SearchHandler"> 2 <!-- 设置默认的参数值,可以在请求地址中修改这些参数--> 3 <lst name="defaults"> 4 <str name="echoParams">explicit</str> 5 <int name="rows">10</int><!--显示数量--> 6 <str name="wt">json</str><!--显示格式--> 7 <str name="df">text</str><!--默认搜索字段--> 8 </lst> 9 </requestHandler>
查询语法:通过 /select 搜索索引,Solr制定一些参数完成不同需求的搜索:
1)q- 查询字符串:必须的,如果查询所有,使用 *:*
2)fq- (filter query)过滤查询,作用:在q查询符合结果中同时是fq查询符合的。
fq- product_price:[1 TO 20] 过滤查询价格从1到20的记录。也可以在“q”查询条件中使用
3)sort- 排序,格式:sort=<field name>+<desc|asc>
4)start- 分页显示使用,开始记录下标,从0开始。
5)rows- 指定返回结果最多有多少条记录,配合start来实现分页。
start- rows- [0,10] 显示前10条
6)fl- 指定返回哪些字段的内容,用逗号或空格分隔多个。
7)df- 指定一个搜索Field;也可以在SolrCore目录中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
8)wt- (writer type)指定输出格式,可以有xml,json,php,phps;默认没有打开。
9)hl是否高亮,设置高亮Field,设置格式前缀和后缀。