Solr搜索引擎

 什么是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的安装配置

  从Solr官方网站(http://lucene.apache.org/solr/)下载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,设置格式前缀和后缀。

上一篇:07 通过docker安装solr


下一篇:05 java调用solr的api完成数据的查询