欢迎投稿

今日深度:

solr学习笔记,

solr学习笔记,


sorl学习笔记

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

一、solr

solr安装和基本配置步骤:

   <!--这段代码本来是被注解的,要自己把注解去掉,修改env-entry-value那里-->
   <env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>C:\temp\solrhome</env-entry-value>
       <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

solrhome文件夹解释

新建一个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文件,在该文件的后面</schema> 标签之前,添加以下代码:

    <!-- IKAnalyzer,其实就是自定义fieldType-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

   <!--IKAnalyzer Field,其实就是用上面的fieldType定义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"/>

在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>1</id>
</delete>
<commit/>

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

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

c.删除所有索引数据

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

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

  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
    </lst>
  </requestHandler> 
<?xml version="1.0" encoding="UTF-8" ?>  
<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配置文件中加入下面代码:

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

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

3.query:查询索引

二、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.查询

大概步骤:

    //先来个简单查询
    @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("<span color:'red'>");
        query.setHighlightSimplePost("<span>");
        //*****************************************************
        //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<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
            List<String> 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("-------------------------------------------");

        }


    }

www.htsjk.Com true http://www.htsjk.com/solr/30612.html NewsArticle solr学习笔记, sorl学习笔记 sorl是基于luncene开发的一个框架,具体就不多解释了,主要是说一下怎么实现 首先简单说一下内容吧! 一、solr solr安装和基本配置步骤: !--这段代码本来是...
相关文章
    暂无相关文章
评论暂时关闭