欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

程序员文章站 2022-05-14 15:25:39
学习Solr前需要有Lucene的基础 Lucene的一些简单用法:https://www.cnblogs.com/dddyyy/p/9842760.html 1.部署Solr到Tomcat(Windows) Solr自带小型服务器jetty,但在我们开发环境中,习惯使用Tomcat,所以把Solr ......

学习solr前需要有lucene的基础

lucene的一些简单用法:

1.部署solr到tomcat(windows)

  solr自带小型服务器jetty,但在我们开发环境中,习惯使用tomcat,所以把solr部署到tomcat上(tomcat 8.0以上,jdk 1.8以上)

  其实步骤相同,但在windows配置要方便一些,所以第一次还是使用windows来部署。

  1.1 准备工作

    solr下载地址:

    tomcat下载地址:  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

   1.2 把 solr-7.5.0\server\solr-webapp下的webapp文件夹移到apache-tomcat-9.0.12\webapps下并改名solr(这个名字随便起)

 Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  1.3 导入运行时候需要的依赖包,把solr-7.5.0\server\lib\ext下的包放到apache-tomcat-9.0.12\webapps\solr\web-inf\lib下,

              把solr-7.5.0\server\lib下m开头的五个jar和gmetric4j-1.0.7.jar放到apache-tomcat-9.0.12\webapps\solr\web-inf\lib下

  1.4 在任意地方创建一个solrhome,里面有一个solrcore,个人和我们的数据库类似,一个用户下可以创建很多个不同的数据库

  1.5 把solr-7.5.0\server下的solr文件夹下的内容复制到solrhome下

Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

 

  1.6 修改默认的solrhome,在apache-tomcat-9.0.12\webapps\solr\web-inf的web.xml修改 加上

    

<env-entry>
       <env-entry-name>solr/home</env-entry-name>
       <env-entry-value>d:\solr\solrhome</env-entry-value>
       <env-entry-type>java.lang.string</env-entry-type>
</env-entry>

  env-entry-value写自己的solrhome位置

  并注释以下这段话,不然会报403

  

  <!-- get rid of error message -->
  <!--<security-constraint>
    <web-resource-collection>
      <web-resource-name>disable trace</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method>trace</http-method>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>enable everything but trace</web-resource-name>
      <url-pattern>/</url-pattern>
      <http-method-omission>trace</http-method-omission>
    </web-resource-collection>
  </security-constraint>-->

  1.7 把solr-7.5.0\server\resources的log4j2.xml放到apache-tomcat-9.0.12\webapps\solr\web-inf的classes文件夹下,classes文件刚开始没有,自己创建一个。

  1.8 启动tomcat

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

2.界面的简单介绍

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  2.1.dashboard

    仪表盘,显示了系统资源,jvm等信息

  2.2.logging

    solr运行的日志

  2.3 core admin

    solr core的管理页面

  2.4 java properties

    solr在jvm 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息

  2.5 thread dump

    显示solr server中当前活跃线程信息,同时也可以跟踪线程运行栈信息

3.创建一个solrcore

  既然之前说类似于数据库,使用数据库之前肯定就要先创建数据库,我们使用solr就要先创建一个solrcore,直接使用可视化界面创建

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  报错了,解决方法:solr-7.5.0\server\solr\configsets\_default下的config文件移到solrhome\new_core下

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  重启tomcat

  在点击下add core 就出现了

 Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  一个mysql实例可以创建多个数据库,所以我们当然可以创建多个solrcore啦

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

   修改core.properties

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

 

   Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  重启tomcat

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

4.solr中的重要信息配置

    在增删查改前,我们要先了解一点solr的信息配置

    在lucenc中有域和索引的概念,域是由域名和域的内容构成的,域名经过分词,形成索引。

    在lucene中域是有类型的,比如stringfield,longfield类型等,那么在solr中域的类型由写在solrhome\new_core\conf\managed-schema中 

  4.1 fieldtype 域类型

    

   <fieldtype name="text_general" class="solr.textfield" positionincrementgap="100" multivalued="true">
      <analyzer type="index">
        <tokenizer class="solr.standardtokenizerfactory"/>
        <filter class="solr.stopfilterfactory" ignorecase="true" words="stopwords.txt" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.synonymgraphfilterfactory" synonyms="index_synonyms.txt" ignorecase="true" expand="false"/>
        <filter class="solr.flattengraphfilterfactory"/>
        -->
        <filter class="solr.lowercasefilterfactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.standardtokenizerfactory"/>
        <filter class="solr.stopfilterfactory" ignorecase="true" words="stopwords.txt" />
        <filter class="solr.synonymgraphfilterfactory" synonyms="synonyms.txt" ignorecase="true" expand="true"/>
        <filter class="solr.lowercasefilterfactory"/>
      </analyzer>
    </fieldtype>

 

    name:类型名字

    class:指定该域类型对应的solr类型

    analyzer:指定分词器(中文使用ikanalyzer)属性type index,query表示在创建索引和查询索引时使用的分词器

    tokenizer:分词器的类型

    filter:过滤器的类型

  4.2 fieldtype 域

    

<field name="id" type="string" indexed="true" stored="true" required="true" multivalued="false" />

    name:域的名字

    type:域的类型(自己定义的)

    indexed:是否索引

    stroed:是否存储

    required:是否必须

    multivalued:是否多值

  4.3 dynamicfield 动态域

    

<dynamicfield name="*_i"  type="pint"    indexed="true"  stored="true"/>

    例子:为文档增加域的时候,你可以用 “随便起的_i”当做域名, 凡是以_i结尾的 type都是pint,需要indexed,需要stored  

  4.4 uniquekey 唯一键

  

<uniquekey>id</uniquekey>

    表示id唯一

5.配置中文分词器 ikanalyzer

  既然要添加索引,添加索引之前需要luncenc帮我们分词,而官方的分词器对中文的分词基本是稀烂的,所以我们需要使用第三方的分词器 ikanalyzer

  5.1 下载ikanalyzer

  下载地址:

  5.2 配置ikanalyzer 

  首先把ik-analyzer-7.5.0.jar放到apache-tomcat-9.0.12\webapps\solr\web-inf\lib目录下

  然后:

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  5.3 使用ikanalyzer

  在solrhome\new_core\conf\managed-schema中自定义fieldtype和field,使用中文分词器来分词

  

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

  5.4 测试一下

    重启tomcat

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用  

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

    问题来了,我的名字没有加到词库,但是如果随着新的词语出现,我们就没办法分词了,ik分词器给我们提供了可以手动或自动加入词汇的方法

    apache-tomcat-9.0.12\webapps\solr\web-inf\classes下的ext.dic加入自己的词汇,重启tomcat

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

6.使用可视化界面增删查改文档

   增加文档

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  更新文档

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

 

   删除文档

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  查询文档

    首先查询所有  *:*

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

      加上过滤条件等一系列条件

    Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

      Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

 

 

      q: 查询关键字 查询所有*:* 查询固定的 就用 域名:域值

      fq:过滤查询

      sort:排序  格式   :  先写域名然后加升序或降序 ,不同域用逗号隔开        id desc,title_ik desc

      start row : 用于分页

      fl:返回指定的域和域值,不同域用逗号隔开

      df:指定一个搜索域,用处:比如有的时候查询,title上要查,content也要查,如果分开查需要两次请求,那么我们就把title内容和content内容放在一起,在起个名字,

        那么我们就直接搜那个域和域的内容,只需要一次请求,我们可以在df中指定要搜索的域,然后直接在q中查

      wt:指定输出格式 

      hi:是否高亮,在指定的域中,比如我搜索中国,经过分词,在title_ik域中找到了中国,那么在中国这两个字之前就加上pre前缀,在后面加上post后缀

7.使用solrj

   solr和solrj的关系类似于mysql和jdbc,用java代码来完成文档的增加。

  7.1坏境搭建    

<dependency>
        <groupid>org.apache.solr</groupid>
        <artifactid>solr-solrj</artifactid>
        <version>7.5.0</version>
</dependency>

  7.2 代码

package com.dingyu.ssolrj;

import java.io.ioexception;

import org.apache.commons.math3.geometry.partitioning.bsptreevisitor.order;
import org.apache.solr.client.solrj.solrquery;
import org.apache.solr.client.solrj.solrquery.order;
import org.apache.solr.client.solrj.solrserverexception;
import org.apache.solr.client.solrj.impl.httpsolrclient;
import org.apache.solr.client.solrj.response.queryresponse;
import org.apache.solr.common.solrdocument;
import org.apache.solr.common.solrdocumentlist;
import org.apache.solr.common.solrinputdocument;
import org.junit.test;

/**
 * solrj的简单使用
 * 
 * @author 丁宇
 *
 */
public class solrjtest {
    /**
     * 获得连接
     * 
     * @return 连接对象
     */
    private httpsolrclient getclient() {
        httpsolrclient client = new httpsolrclient.builder("http://127.0.0.1:8080/solr/new_core").build();
        return client;
    }

    /**
     * 增加/修改文档
     * 
     * @throws solrserverexception
     * @throws ioexception
     */
    @test
    public void addorupdatedoc() throws solrserverexception, ioexception {
        // 获得连接对象
        httpsolrclient client = getclient();
        // 创建一个文档对象
        solrinputdocument document = new solrinputdocument();
        // 加域
        document.addfield("id", "521");
        document.addfield("title_ik", "张三说的在理");
        // 提交
        client.commit();
        client.close();
    }

    /**
     * 删除文档
     * 
     * @throws solrserverexception
     * @throws ioexception
     */
    @test
    public void deletedoc() throws solrserverexception, ioexception {
        // 获得连接对象
        httpsolrclient client = getclient();
        // 根据id删除
        client.deletebyid("521");
        client.commit();
        client.close();
    }
    /**
     * 查询文档
     * @throws solrserverexception
     * @throws ioexception
     */
    @test
    public void selectdoc() throws solrserverexception, ioexception {
        // 获得连接对象
        httpsolrclient client = getclient();
        // 搜索条件
        solrquery query = new solrquery("*:*");
        //设置过滤条件
        query.setfilterqueries("title_ik:[10 to 20]");
        //排序
        query.setsort("title_ik",order.asc);
        //分页
        query.setstart(0);
        query.setrows(10);
        //要显示的域
        query.setfields("id","title_ik");
        // 设置默认搜索域
        query.set("df", "product_name");
        // 设置高亮
        query.sethighlight(true);
        query.addhighlightfield("title_ik");
        query.sethighlightsimplepre("<em>");
        query.sethighlightsimplepost("</em>");
        
        //执行查询
        queryresponse response = client.query(query);
        //查询结果,一个文档集合
        solrdocumentlist results = response.getresults();
        //遍历
        for (solrdocument solrdocument : results) {
            //根据key 获得value
            system.out.println(solrdocument.get("id"));
        }
        client.close();
    }

}

  7.3测试结果

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用

  Solr学习笔记---部署Solr到Tomcat上,可视化界面的介绍和使用,Solr的基本内容介绍,SolrJ的使用