zoukankan      html  css  js  c++  java
  • 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,设置格式前缀和后缀。

  • 相关阅读:
    (转)Python中的__init__和__new__
    PEP8
    python lstrip()函数
    python中的生成器跟迭代器
    callback
    关于0.0.0.0这个ip的疑问
    Python import中相对路径的问题
    python读取excel
    git本地管理多个密钥/账户
    词法分析之有确定、不确定自动机及其生成器
  • 原文地址:https://www.cnblogs.com/HuiH/p/12535174.html
Copyright © 2011-2022 走看看