solr学习笔记

sorl学习笔记

sorl是基于luncene开发的一个框架,具体就不多解释了,主要是说一下怎么实现
首先简单说一下内容吧!

  1. solr:可视化的后台管理器
  2. solrj:提供给java编程的

一、solr

solr安装和基本配置步骤:

  1. 去官网下载solr压缩包;
  2. 环境要求:tomcat,jdk,所以也要下载这两个东西,并安装配置好;
  3. 开始整合solr和tomcat,下面就是整合的步骤:
  4. 把\solr-4.10.3\dist\solr-4.10.3.war复制到tomcat的webapps里面,在当前路径新建一个solr文件夹,把war包的内容解压到solr文件夹里,删除war包;
  5. 把\solr-4.10.3\example\lib\ext下所有的jar包copy到tomcat的solr工程里面的lib文件夹里;
  6. 创建一个solrhome文件夹,例如:C:\temp\solrhome\;
  7. 把\solr-4.10.3\example\solr\路径下的所有内容拷贝到C:\temp\solrhome\里面;
  8. 为了让solr服务器知道solrhome的位置,要修改tomcat里面solr的配置,就是修改web.xml文件,如下
   
   <env-entry>
       <env-entry-name>solr/homeenv-entry-name>
       <env-entry-value>C:\temp\solrhomeenv-entry-value>
       <env-entry-type>java.lang.Stringenv-entry-type>
    env-entry>

solrhome文件夹解释

  1. 在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离。
  2. 在collection1中有一个文件夹叫做conf,包含了索引solr实例的配置信息。
  3. 在conf文件夹下有一个solrconfig.xml。配置实例的相关信息。如果使用默认配置可以不用做任何修改。
  4. 在collection1中有一个lib文件夹,没有就手动创建,是solr服务依赖的扩展包。
  5. 在collection1中有一个data文件夹,没有的话程序会自动创建,配置了索引库的存放路径。

新建一个Sorlcore:只要复制collection1,再重命名粘贴到同一目录下就可以了,比如重命名为collection2,并且还要修改collection2\core.properties文件内容为 name=collection2

这时启动tomcat访问http://localhost:8080/solr/就可以访问solr后台管理界面了。

solr后台管理界面的基本使用

说在前面:因为我们通常都是在处理中文文件,所以一般都是需要用到中文分析器的,这里推荐使用IK分析器,下面简单说一下配置IK分析器的步骤。
首先把IK分析器的jar包丢到tomcat里面的solr工程里,同时也复制IK分析器的配置文件和自定义词典和停用词词典到solr的classpath下,然后在solrhome里面找到collection1\conf\schema.xml文件,在该文件的后面 标签之前,添加以下代码:

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

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

在sorl里面field的名字是不可以随便取的,要符合schema.xml配置文件的要求,这里就不多说这方面的事情了。


在Core selector那里找到collection1,选中他就可以进入下面的操作了,主要说三个操作Document,query和Dataimport

1.Document:创建索引,更新索引和删除索引

创建和更新建议使用json,删除则用xml
1.创建索引的格式:
就直接按json的格式就可以了,例如{“id”:”123456”,”title_ik”:”测试标题”}。

2.更新索引的格式:
更新类似添加,其实就是先删除再添加,如果id存在就是更新,不存在就是添加。

3.删除索引的格式如下:
a.删除制定ID的索引

<delete>
    <id>1id>
delete>
<commit/>

b.删除查询到的索引数据

<delete>
    <query>product_catalog_name:衣服query>
delete>
<commit/>

c.删除所有索引数据

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

2.Dataimport:导入外部数据建立索引,例如mysql数据库的数据

  1. 把\solr-4.10.3\dist\下的两个名字带dataimport的jar包复制到collection1\lib中;
  2. 再把mysql的驱动jar也复制到collection1\lib中;
  3. 在collection1\conf\solrconfig.xml文件中添加以下代码,其实就是添加一个requestHandler:
  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xmlstr>
    lst>
  requestHandler> 
  1. 在collection1\conf\下新建一个data-config.xml文件,并且在里面添加以下代码:
  
<dataConfig>   
<dataSource type="JdbcDataSource"   
          driver="com.mysql.jdbc.Driver"   
          url="jdbc:mysql://localhost:3306/solrData"   
          user="root"   
          password="root"/>   
<document>   
    <entity name="product" query="SELECT p_id,p_name,p_catalog_name,p_price,p_description,p_picture FROM products ">
         <field column="p_id" name="id"/> 
         <field column="p_name" name="product_name"/> 
         <field column="p_catalog_name" name="product_catalog_name"/> 
         <field column="p_price" name="product_price"/> 
         <field column="p_description" name="product_description"/> 
         <field column="p_picture" name="product_picture"/> 
    entity>   
document>   

5.这时候就可以导入mysql里面的数据了吗?还不行,还要为上面的业务系统自定义相关的field,也就是还需要在schema.xml配置文件中加入下面代码:

    
   <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"/>

到这里就差不多了,确实配置挺多东西的。

3.query:查询索引

  1. q - 查询字符串,必须的,如果查询所有使用*:*
  2. fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:product_price:[1 TO 15]
    也可以使用“*”表示无限,例如:
    15以上:product_price:[15 TO *]
    15以下:product_price:[* TO 15]
  3. sort - 排序,格式:sort=+[,+]… 。示例:product_price desc
  4. start - 分页显示使用,开始记录下标,从0开始
  5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
  6. fl - 指定返回那些字段内容,用逗号或空格分隔多个。
  7. df-指定一个默认搜索Field,其实也可以在conf/solrconfig.xml文件中指定默认搜索Field。
  8. wt - (writer type)指定输出格式,可以有 xml, json, php, phps
  9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。

二、solrj

solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。

1.增、改、删

基本步骤:
1. 依赖的jar包:solr-4.10.3\dist\路径下的solr-solrj-4.10.3.jar和solrj-lib文件夹里面的所有jar包。
2. 需要的jar包: solr-4.10.3\example\lib\ext\ 路径下所有的jar包也需要。
3. 和Solr服务器建立连接。HttpSolrServer对象建立连接。
4. 创建一个SolrInputDocument对象,然后添加域。
5. 将SolrInputDocument添加到索引库。
6. 提交。

实现这些操作的代码:

    //通过sorlj插入一个文档
    @Test
    public void addDocument() throws SolrServerException, IOException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        //2.创建一个文档对象
        SolrInputDocument document=new SolrInputDocument();
        //3.向文档中添加域
        document.addField("id", "c5luo45678");
        document.addField("title_ik", "使用solrj添加的文档");
        document.addField("content_ik", "这就是它的那些无聊的内容,无聊透顶了,没什么好看的。");
        document.addField("product_name", "这是一个商品名称");
        //4.把document对象添加到索引库
        solrServer.add(document);
        //5.提交修改
        solrServer.commit();    
    }

    //根据id删除文档
    @Test
    public void deleteDocumentById() throws SolrServerException, IOException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        solrServer.deleteById("c5luo45678");
        solrServer.commit();
    }
    //根据条件删除
    @Test
    public void deleteDocumentByQuery() throws SolrServerException, IOException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        solrServer.deleteByQuery("*:*");
        solrServer.commit();    
    }

    //修改文档
    //solrj里面的修改文档使用的是添加文档的方法,只要id存在就是修改(删除存在的,添加新的),不存在就添加
    @Test
    public void updateDocument() throws SolrServerException, IOException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        //2.创建一个文档对象
        SolrInputDocument document=new SolrInputDocument();
        //3.向文档中添加域
        document.addField("id", "c5luo45678");
        document.addField("title_ik", "我已经不是当初的我了");
        document.addField("content_ik", "我还是那么的无聊");
        document.addField("product_name", "换了个无聊的名字");
        //4.把document对象添加到索引库
        solrServer.add(document);
        //5.提交修改
        solrServer.commit();    
    }

2.查询

大概步骤:

  1. 建立一个和solr服务器的链接,new一个HttpSolrServer对象;
  2. 创建一个query对象;
  3. 往这个query对象里面添加各种各样的查询条件等;
  4. 然后用HttpSolrServer对象来执行这个query的查询,其实就是抛给solr服务器查询;
  5. 最后根据自己的需求取查询结果。
    //先来个简单查询
    @Test
    public void testQueryIndex() throws SolrServerException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        //2.创建一个query对象
        SolrQuery query = new SolrQuery();
        //3.设置查询条件
        query.setQuery("*:*");
        //4.执行查询
        QueryResponse queryResponse = solrServer.query(query);
        //5.取查询结果
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        //6.输出查询到的商品总数目
        System.out.println("一共查询到的商品数量为:"+solrDocumentList.getNumFound());
        //7.遍历查询结果
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("product_name"));
            System.out.println(solrDocument.get("product_price"));
            System.out.println(solrDocument.get("product_catalog_name"));
            System.out.println(solrDocument.get("product_picture"));
        }   
    }

    //来个复杂查询,包含查询、过滤、分页、排序、高亮显示等处理
    @Test
    public void testQueryIndex2() throws SolrServerException{
        //1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
        SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
        //2.创建一个query对象
        SolrQuery query = new SolrQuery();
        //3.设置查询条件
        query.setQuery("台灯");
        //4.设置过滤条件
        query.setFilterQueries("product_price:[10 TO 200]");
        //5.设置排序规则
        query.setSort("product_price", ORDER.asc);
        //6.分页处理
        query.setStart(0);
        query.setRows(20);
        //7.设置结果需要包含的域
        query.setFields("id","product_name","product_price");
        //8.设置默认搜索域
        query.set("df", "product_keywords");
        //9.高亮显示搜索的关键词,只是product_name
        query.setHighlight(true);
        query.addHighlightField("product_name");
        query.setHighlightSimplePre("");
        query.setHighlightSimplePost("");
        //*****************************************************
        //10.执行查询
        QueryResponse queryResponse = solrServer.query(query);
        //11.获取结果
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        System.out.println("结果的数量:"+solrDocumentList.getNumFound());
        for (SolrDocument solrDocument : solrDocumentList) {
            String id = (String)solrDocument.get("id");
            System.out.println(id);
            //获取高亮内容
            String product_name="";
            Map>> highlighting = queryResponse.getHighlighting();
            List list = highlighting.get(id).get("product_name");
            //判断是否有高亮内容,因为默认查询的域是product_keywords,所以有可能关键字不一定在product_name里面,所以就会有些没有高亮
            if(list!=null){
                product_name=list.get(0);
            }else{
                product_name=(String) solrDocument.get("product_name");
            }
            System.out.println(product_name);
            System.out.println(solrDocument.get("product_price"));
            System.out.println("-------------------------------------------");

        }


    }

你可能感兴趣的:(javaEE)