zoukankan      html  css  js  c++  java
  • solr初次使用

    什么是solr?

    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。


    solr整合Tomcat步骤

    第一步:安装tomcat。D: empapache-tomcat-7.0.53

    第二步:把solr的war包复制到tomcat 的webapp目录下。

    把solr-4.10.3distsolr-4.10.3.war复制到D: empapache-tomcat-7.0.53webapps下。

    改名为solr.war
    第三步:solr.war解压。使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war

    第四步:把solr-4.10.3examplelibext目录下的所有的jar包添加到solr工程中

    第五步:配置solrHome和solrCore。

    1)创建一个solrhome(存放solr所有配置文件的一个文件夹)。solr-4.10.3examplesolr目录就是一个标准的solrhome。

    2)把solr-4.10.3examplesolr文件夹复制到D: emp108路径下,改名为solrhome,改名不是必须

    3)在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离

    第六步:告诉solr服务器配置文件也就是solrHome的位置。修改web.xml使用jndi的方式告诉solr服务器。

        Solr/home名称必须是固定的。

    第七步:启动tomcat

    第八步:访问http://localhost:8080/solr/



    copyField(复制域)

      copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索

      根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中,如下:

    <copyField source="title" desc="text">
    <copyField source="content" desc="text">

    dynamicField(动态字段)

      动态字段就是不用指定具体的名称,只要定义字段名称的规则,

        例如定义一个 dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的

        例如:name_i,gender_i,school_i等。

    安装中文分词器

    第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。

    第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的classpath下。

    第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。

    <!-- IKAnalyzer-->
        <fieldType name="text_ik" class="solr.TextField">
          <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        </fieldType>

    第四步:定义field,指定field的type属性为text_ik

    <!--IKAnalyzer Field-->
       <field name="title_ik" type="text_ik" indexed="true" stored="true" />
       <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

    第五步:重启tomcat

    使用Analyse测试


    使用数据库批量导入数据(MySQL)

    第一步:把dataimport插件依赖的jar包添加到solrcore(collection1lib)中

      solr-4.10.3dist

         solr-dataimporthandler-4.10.3.jar

         solr-dataimporthandler-extras-4.10.3.jar

      还需要mysql的数据库驱动

    第二步:配置solrconfig.xml文件,添加一个requestHandler。

    <requestHandler name="/dataimport" 
    class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
          <str name="config">data-config.xml</str>
         </lst>
      </requestHandler> 

    第三步:创建一个data-config.xml,保存到collection1conf目录下

    <?xml version="1.0" encoding="UTF-8" ?>  
    <dataConfig>   
    <dataSource type="JdbcDataSource"   
              driver="com.mysql.jdbc.Driver"   
              url="jdbc:mysql://localhost:3306/lucene"   
              user="root"   
              password="root"/>   
    <document>   
        <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
             <field column="pid" name="id"/> 
             <field column="name" name="product_name"/> 
             <field column="catalog_name" name="product_catalog_name"/> 
             <field column="price" name="product_price"/> 
             <field column="description" name="product_description"/> 
             <field column="picture" name="product_picture"/> 
        </entity>   
    </document>   
    
    </dataConfig>

    第四步:添加业务Field 在schema.xml添加

    <!--product-->
       <field name="product_name" type="text_ik" indexed="true" stored="true"/>
       <field name="product_price"  type="float" indexed="true" stored="true"/>
       <field name="product_description" type="text_ik" indexed="true" stored="false" />
       <field name="product_picture" type="string" indexed="false" stored="true" />
       <field name="product_catalog_name" type="string" indexed="true" stored="true" />
    
       <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
       <copyField source="product_name" dest="product_keywords"/>
       <copyField source="product_description" dest="product_keywords"/>

    第五步:重启tomcat


    操作语句

    删除  

    1) 删除制定ID的索引

    <delete>
             <id>8</id>
    </delete>
    <commit/>

    2) 删除查询到的索引数据

    <delete>
          <query>product_catalog_name:幽默杂货</query>
    </delete>

    3) 删除所有索引数据

     <delete>
         <query>*:*</query>
    </delete>

    查询索引

      查询所有:

          *:*

      范围查询:

        域名:[值 TO 值]、域名:{值 TO 值]、域名:[值 TO 值}、域名{值 TO 值}

        也可以使用“*”表示无限,例如:

        20以上:product_price:[20 TO *]

        20以下:product_price:[* TO 20]

      排序:

         <field name>+<desc|asc>[,<field name>+<desc|asc>]

      分页:

        从0开始、显示条数

      fl - 指定返回那些字段内容,用逗号或空格分隔多个

      df-指定一个默认搜索Field

      wt - (writer type)指定输出格式,

        可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。

      hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。


    使用SolrJ管理索引库

    jar包:

      solr-4.10.3distsolrj-lib

          下全部jar包共8个

      solr-4.10.3dist

          solr-solrj-4.10.3.jar

      其他

         commons-logging-1.2.jar

      1 package cn.solr.demo;
      2 
      3 
      4 import java.util.List;
      5 import java.util.Map;
      6 
      7 import org.apache.solr.client.solrj.SolrQuery;
      8 import org.apache.solr.client.solrj.SolrQuery.ORDER;
      9 import org.apache.solr.client.solrj.SolrServer;
     10 import org.apache.solr.client.solrj.SolrServerException;
     11 import org.apache.solr.client.solrj.impl.HttpSolrServer;
     12 import org.apache.solr.client.solrj.response.QueryResponse;
     13 import org.apache.solr.common.SolrDocument;
     14 import org.apache.solr.common.SolrDocumentList;
     15 import org.apache.solr.common.SolrInputDocument;
     16 import org.junit.Test;
     17 
     18 /**
     19  * solr 单机版测试
     20  * @author xiaou
     21  *
     22  */
     23 public class SolrDemo {
     24     @Test
     25     //添加索引
     26     public void testAdd() throws Exception {
     27         //1.连接solr服务器
     28         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
     29         SolrInputDocument doc = new SolrInputDocument();
     30         doc.addField("id", "c0001");
     31         doc.addField("product_catalog_name", "爱你");
     32         solrServer.add(doc);
     33         solrServer.commit();
     34     }
     35     
     36     @Test
     37     //删除索引
     38     public void testDelete() throws Exception {
     39         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
     40         solrServer.deleteById("c0001");
     41         solrServer.commit();
     42     }
     43     
     44     @Test
     45     //修改索引
     46     //通过先删后增的方式进行修改
     47     public void testUpdate() throws Exception {
     48         //1.连接solr服务器
     49         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
     50         SolrInputDocument doc = new SolrInputDocument();
     51         doc.addField("id", "c0001");
     52         doc.addField("product_catalog_name", "爱你咯");
     53         solrServer.add(doc);
     54         solrServer.commit();
     55     }
     56     
     57     @Test
     58     //简单查询
     59     public void queryIndex() throws Exception {
     60         //1.连接solr服务器
     61         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
     62         //2.创建查询对象
     63         SolrQuery query = new SolrQuery();
     64         //3.设置查询条件
     65         query.setQuery("*:*");
     66         //4.执行查询
     67         QueryResponse response = solrServer.query(query);
     68         //5.取回结果集
     69         SolrDocumentList results = response.getResults();
     70         System.out.println("共有"+results.getNumFound()+"条记录");
     71         System.out.println("-------------------------------------------------");
     72         //6.遍历结果集
     73         for (SolrDocument solrDocument : results) {
     74             System.out.println("商品id "+solrDocument.get("id"));
     75             System.out.println("商品名称 "+solrDocument.get("product_name"));
     76             System.out.println("商品价格 "+solrDocument.get("product_price"));
     77             System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
     78             System.out.println("-----------------------------------------------------------");
     79         }
     80     }
     81     @Test
     82     //复杂查询
     83     //查询、过滤、分页、排序、高亮
     84     public void queryIndex2() throws Exception {
     85         SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
     86         SolrQuery query = new SolrQuery();
     87         //设置默认查询域
     88         query.set("df", "product_name");
     89         //设置查询条件
     90         query.setQuery("家天下");
     91         //设置过滤条件
     92         query.set("fq", "product_catalog_name:幽默杂货");
     93         //设置排序
     94         query.setSort("product_price", ORDER.desc);
     95         //分页
     96         query.setStart(0);
     97         query.setRows(20);
     98         //结果中要包含的域
     99         query.setFields("id","product_name","product_price","product_catalog_name");
    100         //打开高亮显示
    101         query.setHighlight(true);
    102         //设置高亮显示的域
    103         query.addHighlightField("product_name");
    104         //设置高亮的前缀和后缀
    105         query.setHighlightSimplePre("<span style='color:red'>");
    106         query.setHighlightSimplePost("</span>");
    107         QueryResponse queryResponse = solrServer.query(query);
    108         SolrDocumentList documentList = queryResponse.getResults();
    109         System.out.println("共有"+documentList.getNumFound()+"条记录");
    110         for (SolrDocument solrDocument : documentList) {
    111             System.out.println("商品id "+solrDocument.get("id"));
    112             System.out.println("商品名称 "+solrDocument.get("product_name"));
    113             System.out.println("商品价格 "+solrDocument.get("product_price"));
    114             System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
    115             Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
    116             List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
    117             if(list!=null) {
    118                 System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++");
    119                 System.out.println(list);
    120             }
    121             System.out.println("-----------------------------------------------------------");
    122         }
    123     }
    124 }
    demo
  • 相关阅读:
    public/private/protected的具体区别
    解决密码自动填充的问题
    tp导出excel
    好久没更了,确实太忙了--dedecms篇
    解决css的float父div没有高度
    随笔
    总结最近写的h5项目
    ajax删除当前行
    开发时常遇到的小问题
    js处理时间戳
  • 原文地址:https://www.cnblogs.com/FlyBlueSky/p/9324638.html
Copyright © 2011-2022 走看看