欢迎投稿

今日深度:

solr的使用,

solr的使用,


学solr之前先看看lucenehttps://blog.csdn.net/kxj19980524/article/details/85158207

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与Lucene的区别:

Lucene是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,Lucene提供了完整的查询引擎和索引引擎,目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者以Lucene为基础构建全文检索引擎。

 Solr的目标是打造一款企业级的搜索引擎系统,它是一个搜索引擎服务,可以独立运行,通过Solr可以非常快速的构建企业的搜索引擎,通过Solr也可以高效的完成站内搜索功能。

 

solr运行流程,当客户端发送搜索请求的时候,比如京东,搜一个商品,这个请求会发送到京东项目打的war包中,在这个war包里会有接口访问solr服务器,然后solr去访问索引库查出结果,然后进行回馈.

 solr下载地址http://lucene.apache.org/solr/

bin目录里直接双击这个就可以启动solr,但是这么启动使用的是它内置的服务器Jetty,这个服务器非常不稳定

搭建solr服务,先在盘符下创一个solr文件夹,然后准备一个全新的tomcat,和解压后的solr,放到solr文件夹下

然后找到这个目录下复制solr的war包,给它放到tomcat的webapp下面,并且解压这个war包,然后把war包删掉

然后进到这个目录下复制这五个jar包

放到这个目录下

然后创建一个solrhome,solrhome就是索引库

到这个目录下把所有东西都复制一份,放solrhome中去

collection1是核,每个核相当于mysql的每个库,solrhome相当于mysql,mysql下可以有多库.solrhome下就可以有多核,每个核下会自动生成date目录来存储数据.

然后编辑web.xml

在40行把这注释打开,然后复制solrhome路径放到value里面

然后就搭建成功了,进入tomcat,启动它

访问这个路径就访问成功了,这个是solr的后台管理的一个页面

添加核的时候不能在这个页面进行添加,说找不到一个配置文件,但是可以自己手动添加 ,复制一份改里面的配置文件,然后重启,就会发现多了一个核,但是一般没人这么干除非是非要在一台电脑上整俩核

在这个目录下有个schema.xml这里面配置了solr的一些域的信息

fieldType这个标签就是定义域的,name就是随便起的名字,后面class对应的就是域的类,其实跟lucene里面的类一样,只不过名字前加了点东西而已,底层还是lucene实现的

在这里你会看到field标签,这个标签里的type就是对应的上面name,它是用来定义详细信息的,indexed表示是否索引,stored表示是否保存到索引库

required表示是否必须,lucene里面有默编号在那里面不需要自己定义但是solr里能自己定义,multiValued表示的是是否多值,就相当于list集合

这种标签就是动态域,就是使用域的时候只要以这些结尾都可以,使用solr的话使用域时,必须在这个配置文件里能找到,找不到会报错,如果想自定义域的话,在这个配置文件里自己加就可以了.

这块是拷贝域,就是把这些域都放到一个test域里面去,当保存索引的时候,它会自动在把这些域存test域里面,当搜索的时候,只查询一次发一次请求就可以了,直接就到test域里去搜索去了

这个就是保存索引和搜索的时候分别用的什么分词器

安装ik分词器https://download.csdn.net/download/kxj19980524/10867301

复制jar包放到这里面

然后复制这三个配置文件,放到classes文件夹下,这个文件夹得自己创建

然后在schema.xml里配置ik分词器,就在最下面随便找个地配就行了

<!-- IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>
    <!--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"/>

然后在这里就可以使用了

再新填分词的时候,记得要改成这个编码,不然会乱码

后台删除得使用xml格式进行删除,可以根据id删,也可以根据条件删除

导入数据,发现这报错,显示没有导入数据的处理器,所以接下来配置一下批量导入

复制这两个jar包

粘贴到这个目录下,lib文件夹自己创建,并且再加一个mysql驱动包,因为是要从mysql数据库导,如果使用的Oracle的话就换成oracle的驱动包

然后打开solr的核心配置文件

 

在最下面添加这么一段,并且在同级目录下创建data-config.xml

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

 

 因为上面的有些域没有,所以得自己进行定义,在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"/>

 然后重启服务,就会发现这有东西了,就可以建立索引库了

执行完成后,就可以在这查到了

solr查询中有过滤条件,就不用拼接表达式了,10 TO * 表示10块钱以上的,*写前面10写后面表示10块以下的

 

例如百度这就是加的高亮

使用solrJ管理索引库

solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,solrj去访问tomcat,然后tomcat去访问索引库然后返回结果

 写个demo试试,创建项目,然后导入jar包.

然后写个单元测试,进行测试,添加和修改相同的api,只要id相同就是更新,id没有就是添加

@Test
    public void testAdd() throws Exception{
        //单机版
        String baseURL = "http://localhost:8080/solr/";              //这个路径默认是往核1里面添加

       //String baseURL = "http://localhost:8080/solr/collection2";  //这就是指定往哪个核里添加
        SolrServer solrServer = new HttpSolrServer(baseURL);
        
        //添加
        SolrInputDocument doc = new SolrInputDocument();
        doc.setField("id", "哈哈");
        doc.setField("name", "范冰冰");
        solrServer.add(doc);
        solrServer.commit();
    }

删除所有,还有好几个重载方法,自己可以根据api看看,进行测试,如果想按条件删除改下表达式就可以了,冒号前是域,后面是值

    //删除
    @Test
    public void testDelete() throws Exception{
        //单机版
        String baseURL = "http://localhost:8080/solr/";
        SolrServer solrServer = new HttpSolrServer(baseURL);
                
        solrServer.deleteByQuery("*:*", 1000);    
    } 

查询,set里面的key都是与后台上面的对应的,下面写的基本上把平时能使用到的都加上了. 

//查询
    @Test
    public void testUpdate() throws Exception{
        //单机版
        String baseURL = "http://localhost:8080/solr/";
        SolrServer solrServer = new HttpSolrServer(baseURL);
        //查询 关键词 台灯 过滤条件 "product_catalog_name":"幽默杂货","product_price":0-10,
        //价格排序 分页 开始行 每页数 高亮 默认域 只显示指定的域 
        SolrQuery solrParams = new SolrQuery();
        
        //关键词
        //solrParams.set("q", "product_name:台灯");  两种写法任选一个
        solrParams.setQuery("product_name:台灯");
        //设置过滤条件
        solrParams.set("fq", "product_catalog_name:幽默杂货");
        solrParams.set("fq", "product_price:[* TO 10]");
        //价格排序
        solrParams.addSort("product_price", ORDER.desc);
        //分页
        solrParams.setStart(0);
        solrParams.setRows(5);
        //默认域 
        solrParams.set("df", "product_name");
        //只查询指定域
        solrParams.set("f1", "id,product_name");
        //高亮
        //打开开关
        solrParams.setHighlight(true);
        //指定高亮域
        solrParams.addHighlightField("product_name");
        //前缀
        solrParams.setHighlightSimplePre("<span style='color:red'>");
        //后缀
        solrParams.setHighlightSimplePost("</span>");
        
        //执行查询
        QueryResponse query = solrServer.query(solrParams);
        //文档结果集
        SolrDocumentList results = query.getResults();
        //获取高亮的结果集,因为高亮特殊,与普通的结果集不在一个里面.
        Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();
        
        long numFound = results.getNumFound();
        System.out.println(numFound);
        for(SolrDocument doc:results) {
            System.out.println(doc.get("id"));
            System.out.println(doc.get("product_catalog_name"));
            System.out.println(doc.get("product_price"));
            System.out.println(doc.get("product_name"));
            System.out.println(doc.get("product_picture"));
            
            System.out.println("-------------");
            
            Map<String, List<String>> map = highlighting.get(doc.get("id"));
            List<String> list = map.get("product_name");
            System.out.println(list.get(0));
        }
    }

www.htsjk.Com true http://www.htsjk.com/solr/38543.html NewsArticle solr的使用, 学solr之前先看看lucenehttps://blog.csdn.net/kxj19980524/article/details/85158207 Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为...
相关文章
    暂无相关文章
评论暂时关闭