• 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官方网站(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,设置格式前缀和后缀。

  • 相关阅读:
    P2P之UDP穿透NAT的原理与实现
    Jmeter压力测试工具安装及使用教程
    整合Solr与tomcat以及第一个core的配置
    windows下Redis安装及利用java操作Redis
    spring整合Jersey 无法注入service的问题
    MySQL-Navicat连接MySQL出现1251或1130报错的解决方法
    华为VRP
    开发工具-Sublime
    服务器-Windows 2003 R2-取消多用户登录-多个用户登录显示不同的界面解决方法
    服务器-惠普 HP ProLiant-linux系统-RAID信息查看和阵列卡操作-hpacucli工具使用
  • 原文地址:https://www.cnblogs.com/HuiH/p/12535174.html
Copyright © 2020-2023  润新知