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 .commit();     
        solrServer.deleteByQuery("*:*", 1000);    
    } 

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

<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>4.10.4</version>
</dependency>

//查询
    @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);
        //默认域  如果不加默认域的话,会从text域中查.
        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));
        }
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 概述 4 1.1 企业搜索引擎方案选型 4 1.2 Solr的特性 4 1.2.1 Solr使用Lucene并且进行了扩展 4 1.2.2 Schema(模式) 5 1.2.3 查询 5 1.2.4 核心 5 1.2.5 缓存 5 1.2.6 复制 6 1.2.7 管理接口 6 1.3 Solr服务原理 6 1.3.1 索引 6 1.3.2 搜索 7 1.4 源码结构 8 1.4.1 目录结构说明 8 1.4.2 Solr home说明 9 1.4.3 solr的各包的说明 10 1.5 版本说明 11 1.5.1 1.3版本 11 1.5.2 1.4版本 12 1.6 分布式和复制 Solr 架构 13 2 Solr的安装与配置 13 2.1 在Tomcat下Solr安装 13 2.1.1 安装准备 13 2.1.2 安装过程 14 2.1.3 验证安装 15 2.2 中文分词配置 15 2.2.1 mmseg4j 15 2.2.2 paoding 19 2.3 多核(MultiCore)配置 22 2.3.1 MultiCore的配置方法 22 2.3.2 为何使用多core ? 23 2.4 配置文件说明 23 2.4.1 schema.xml 24 2.4.2 solrconfig.xml 25 3 Solr的应用 29 3.1 SOLR应用概述 29 3.1.1 Solr的应用模式 29 3.1.2 SOLR使用过程说明 30 3.2 一个简单的例子 30 3.2.1 Solr Schema 设计 30 3.2.2 构建索引 30 3.2.3 搜索测试 31 3.3 搜索引擎的规划设计 32 3.3.1 定义业务模型 32 3.3.2 定制索引服务 34 3.3.3 定制搜索服务 34 3.4 搜索引擎配置 34 3.4.1 Solr Schema 设计(如何定制索引的结构?) 34 3.5 如何进行索引操作? 36 3.5.1 基本索引操作 36 3.5.2 批量索引操作 37 3.6 如何进行搜索 39 3.6.1 搜索语法 39 3.6.2 排序 42 3.6.3 字段增加权重 42 3.6.4 Solr分词器、过滤器、分析器 42 3.6.5 Solr高亮使用 46 4 SolrJ的用法 46 4.1 搜索接口的调用实例 46 4.2 Solrj的使用说明 47 4.2.1 Adding Data to Solr 47 4.2.2 Directly adding POJOs to Solr 49 4.2.3 Reading Data from Solr 51 4.3 创建查询 51 4.4 使用 SolrJ 创建索引 52 4.5 Solrj包的结构说明 53 4.5.1 CommonsHttpSolrServer 53 4.5.2 Setting XMLResponseParser 53 4.5.3 Changing other Connection Settings 53 4.5.4 EmbeddedSolrServer 54 5 Solr的实际应用测试报告 54 5.1 线下压力测试报告 54 5.2 线上环境运行报告 54 6 solr性能调优 55 6.1 Schema Design Considerations 55 6.1.1 indexed fields 55 6.1.2 stored fields 55 6.2 Configuration Considerations 55 6.2.1 mergeFactor 55 6.2.2 mergeFactor Tradeoffs 56 6.3 Cache autoWarm Count Considerations 56 6.4 Cache hit rate(缓存命中率) 56 6.5 Explicit Warming of Sort Fields 56 6.6 Optimization Considerations 56 6.7 Updates and Commit Frequency Tradeoffs 56 6.8 Query Response Compression 57 6.9 Embedded vs HTTP Post 57 6.10 RAM Usage Considerations(内存方面的考虑) 57 6.10.1 OutOfMemoryErrors 57 6.10.2 Memory allocated to the Java VM 57 7 FAQ 58 7.1 出现乱码或者查不到结果的排查方法: 58

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值