springboot集成solr实现全局搜索系列

1 Solr介绍

1.1 什么是solr?

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

Solrapache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。

Solrlucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。

Solr是如何实现全文检索的呢?

1,索引流程:solr客户端(浏览器、java程序)可以向solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档,通过该文档,solr实现对索引的维护(增删改)

2,搜索流程:solr客户端(浏览器、java程序)可以向solr服务端发送GET请求,solr服务器返回一个xml/json文档。

1.2 Solr和lucene的区别

Lucene是一个全文检索引擎工具包,它只是一个jar包,不能独立运行,对外提供服务。

Solr是一个全文检索服务器,它可以单独运行在servlet容器,可以单独对外提供搜索和索引功能。Solrlucene在开发全文检索功能时,更快捷、更方便。
在这里插入图片描述

2 Solr安装配置

2.1 下载solr

Solrlucene的版本是同步更新的,最新的版本是8.1.0/

本课程使用的版本:7.1.0

下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/
下载版本:7.1.0
在这里插入图片描述

  1. src.tgz:带src表示是带源码文件的压缩包,无src是已经编译过的压缩包
  2. .tgz:Linux相关操作系统使用的压缩包
  3. .zip:Windows操作系统使用的压缩包
    在这里插入图片描述
    Jetty 是一个开源的servlet容器,它为基于Javaweb容器,例如JSPservlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)Java应用提供网络和web连接。

2.2 启动Solr

在这里插入图片描述
solr的启动、停止、查看命令:

  1. 启动:bin\solr.cmd start
  2. 停止:bin\solr stop 或bin\solr stop -all
  3. 查看:bin\solr status

访问地址:http://localhost:8983/solr/#/
在这里插入图片描述

2.3 Tomcat安装运行环境

Jdk:1.8及以上
Solr:7.1
Web服务器:tomcat 8(改端口9080)

2.3.1 操作步骤

1、找到如下目录内容:
D:\guoweixin\solr\solr-7.1.0\server\solr-webapp
在这里插入图片描述
2、复制到Tomcat下,并命令为solr
D:\guoweixin\solr\apache-tomcat-solr\webapps
在这里插入图片描述
2、将solr-7.1.0\server\lib\ext下的所有jar包,以及solr-7.1.0\server\lib下以metrics开头的jar、gmetric4j-1.0.7.jar复制到apache-tomcat-8\webapps\solr\WEB-INF\lib
在这里插入图片描述
3、在tomcat\webapps\solr\WEB-INF中,新建classes文件夹,将solr-7.1.0\server\resources下的log4j.properties文件拷贝到里面
在这里插入图片描述
在这里插入图片描述
创建Solr CoreAdmin管理(Solr Home)
4、创建SOLR HOME目录(solr_home)
在这里插入图片描述
5、拷贝solr-7.1.0\server\solr下所有文件、文件夹复制到solr_home目录下
6、拷贝solr-7.1.0 下contrib和dist文件夹至solr_home目录下
7、在solr_home目录下新建demo_core文件夹;
并拷贝D:\guoweixin\solr\solr_home\configsets\sample_techproducts_configs目录下conf文件夹至solr_home\demo_core
在这里插入图片描述
在这里插入图片描述
8(需要)、修改solr_home\demo_core\conf\solrconfig.xml文件,如下(75行处)
在这里插入图片描述
9、修改tomcat\webapps\solr\WEB-INF中的web.xml文件
新增如下部分,默认是注释掉的。 (40行处)
其中env-entry-value值为solr_home对应值,即solr home目录
在这里插入图片描述
10、修改tomcat\webapps\solr\WEB-INF中的web.xml文件(注释如下部分内容)最下面162行
在这里插入图片描述
11、启动Tomcat
启动tomcat,访问http://localhost:8080/solr/index.html

2.4 solr界面介绍

启动solr服务
http://localhost:8080/solr/index.html
在这里插入图片描述

2.4.1 Dashboard

仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。

2.4.2 Logging

显示solr运行出现的异常或错误

2.4.3 Core Admin

Solr Core的管理界面。在这里可以添加SolrCore实例。
主要有Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重新加载核心),Optimize(优化索引库)
Add Core是添加core:主要是在instanceDir对应的文件夹里生成一个core.properties文件 。
在这里插入图片描述

name:给core起的名字;
instanceDir:与我们在配置solr到tomcat里时的solr_home里新建的core文件夹名一致;
dataDir:确认Add Core时,会在new_core目录下生成名为data的文件夹
config:new_core下的conf下的config配置文件(solrconfig.xml)
schema: new_core下的conf下的schema文件(schema.xml)

2.4.4 java properties

Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。可查看到java相关的一些属性的信息。
在这里插入图片描述

2.4.5 Tread Dump

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

2.4.6 Core selector(重点)

需要在Core Admin里添加了core后才有可选项。

选择一个SolrCore进行详细操作,如下:
在这里插入图片描述

2.4.6.1 Analysis(重点)

在这里插入图片描述
通过此界面可以测试索引分析器和搜索分析器的执行情况。
注:solr中,分析器是绑定在域的类型中的。

2.4.6.2 dataimport

可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。
默认没有配置,需要手工配置。

2.4.6.3 Document

通过/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
通过此菜单可以创建索引、更新索引、删除索引等操作。

2.4.6.4 Query(重点)

通过/select执行搜索索引,必须指定“q”查询条件方可搜索。
在这里插入图片描述

2.5 Solr core的配置(创建)

1、新建core(创建guo_core文件夹)
新建的solrhome文件的位置为:D:\guoweixin\solr\solr_home\guo_core
2、D:\guoweixin\solr\solr_home\configsets\sample_techproducts_configs\ 目录下conf文件夹复制到solr_home\guo_core

3、在http://localhost:8080/solr/index.html管理界面中添加guo_core
点击 add Core 按钮进行添加
在这里插入图片描述

3 Solr导入数据

3.1 查看core

在这里插入图片描述
通过此查看创建的guo_core,则说明没有相关配置文件,需要添加并修改。

3.2 DataImport导入数据

该功能是将数据库中数据通过Sql语句方式导入到Solr索引库中。

3.2.1 第一步:添加jar包

D:\guoweixin\solr\solr-7.1.0\dist 下的jar
在这里插入图片描述
mysql jar
在这里插入图片描述
配置Solr:找到自带的中文分词器
D:\guoweixin\solr\solr-7.1.0\contrib\analysis-extras\lucene-libs
在这里插入图片描述
以上所有jar全部复制到 webapps/solr/WEB-INF/lib
在这里插入图片描述

3.2.2 第二步:配置中文分词器

修改同目录下的managed-schema文件
在这里插入图片描述
1、在文件最后方插入中文分词器:
在这里插入图片描述

<!-- ChineseAnalyzer -->
    <fieldType name="solr_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
      </analyzer>
    </fieldType>

3.2.3 managed-schema文件详解

找到solr_home\core_meeting\conf下managed-schema文件

在managed-schema.xml文件中,主要配置SolrCoe数据信息,包括:Field和FieldType的定义等信息,在solr中,Field和FieldType都需要先定义后使用!

Field详解:
学习详细参考:http://blog.csdn.net/mine_song/article/details/58065323
https://www.cnblogs.com/gslblog/p/6582008.html
在这里插入图片描述

name:指定域的名称(自定义) type:指定域的类型 indexed:是否索引 是:(将分好的词进行索引,索引的目的,就是为了搜索)
否:不索引,也就是不对该field域进行搜索。 stored:是否存储
是:将field域中的内容存储到文档域中。存储的目的,就是为了搜索页面显示取值用的
否:不将field域中的内容存储到文档域中。不存储,则搜索页面中没法获取该field域的值。 required:是否必须
multiValued:是否多值,比如查询数据需要关联多个字段数据,一个Field存储多个值信息,必须将multiValued设置为true。

dynamicField详解(199行):
在这里插入图片描述
name为*_i,定义它的type为int,那么在使用这个字段的时候,任何以_i结果的字段都被认为符合这个定义。

uniqueKey
在这里插入图片描述
其中的id是在Field标签中已经定义好的域名,而且该域设置为requiredtrue
一个managed-schema文件中必须有且仅有一个唯一键

copyField
复制域
应用场景:我们在搜索时比如输入java,一篇文章分为标题、简介、内容等很多字段,输入的关键字需要制定solr中的域进行检索,不可能从一个表中将所有字段进行索引,因为有些字段不需要索引,所以出现copyField域,把多个域的关键词复制到同一个域,多个域时,可以放到一个域中。就不用定义那么多域了。搜索比较方便
实例:<copyField source="projectName" dest="keywords"/>
Source:是Field域的名称
Dest:是destination的缩写 目标域

使用案例:
1、 两个普通域 :titleauthor
在这里插入图片描述
2、 使用复制域,将两个域进行索引检索
在这里插入图片描述
3、 该域名field name=”text”即是复制域
在这里插入图片描述
fieldType
域类型:
在这里插入图片描述
在这里插入图片描述
分词器:
在这里插入图片描述

  • Name:指定域类型的名称
  • Class:指定该域类型对应的solr的类型
  • Analyzer:指定分析器
  • Type:index、query,分别指定搜索和索引时的分析器
  • Tokenizer:指定分词器
  • Filter:指定过滤器

3.2.4 第三步:修改 solrconfig.xml文件

找到D:\guoweixin\solr\solr_home\guo_core\conf文件夹下的solrconfig.xml,添加dataimport
在这里插入图片描述
首先查询是否存在dataimportequestHandler,如果不存在,因此需要手动添加。为了以后便于维护此文件,我们就在requestHandler起始位置,约为720行处,添加如下内容

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
    <str name="config">data-config.xml</str>
    </lst>
</requestHandler>

在这里插入图片描述

3.2.5 第四步:创建data-config.xml

data-config.xml作用:数据库连接相关信息、SQL以及查询结果映射对应域中
solrconfig.xml同级目录下,创建data-config.xml
在这里插入图片描述

  • Query代表:查询的SQL语句
  • Column代表:SQL查询的列名
  • Name代表:Solr 域Filed中的域名
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig> 
  <dataSource type="JdbcDataSource" 
              driver="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://localhost:3306/solr" 
              user="root" 
              password="root"/> 
  <document> 
		<entity name="products"  query="select pid,pname,catalog_name,price,description,picture from products ">
				 <field column="pid" name="id"/>  
				 <field column="pname" name="prod_pname"/>  
				 <field column="catalog_name" name="prod_catalog_name"/>  
				 <field column="price" name="prod_price"/>  
				 <field column="description" name="prod_description"/>  
				 <field column="picture" name="prod_picture"/>  
		</entity> 
  </document> 
</dataConfig>

在这里插入图片描述
在这里插入图片描述

3.2.6 第四步:定义域

修改同目录下的managed-schema文件
在这里插入图片描述
1、在文件最后方插入中文分词器:
在这里插入图片描述
同时还要配置其Field域:来配置字段【这里的名字要与data-config中的域名一模一样】
在这里插入图片描述

<field name="prod_pname" type="solr_cnAnalyzer" indexed="true" stored="true" required="true"  /> 
	   <field name="prod_catalog_name" type="string" indexed="true" stored="true" required="true"  /> 
	   <field name="prod_price" type="pdouble" indexed="true" stored="true" required="true"  /> 
       <field name="prod_description" type="solr_cnAnalyzer" indexed="true" stored="true" required="true"  /> 
       <field name="prod_picture" type="string" indexed="false" stored="true" required="true"  />

其中prod_pname需要模糊查询(中文分词),故将其类型改为solr_cnAnalyzer
在这里插入图片描述

3.2.7 第五步:启动服务

1、启动Tomcat服务器
2、查看数据导入结果
重启Tomcat服务器,进入 guo_core ,测试中文分词器效果
在这里插入图片描述
重启Tomcat服务器,进入guo_coreDataImport 执行 execute
在这里插入图片描述
在这里插入图片描述
查询描述

1,q 查询的关键字,此参数最为重要,例如,q=id:1,默认为q=:
2,fl 指定返回(回显)哪些字段,用逗号或空格分隔,注意:字段区分大小写,例如,fl= id,title,sort
3,start 返回结果的第几条记录开始,一般分页用,默认0开始
4,rows 指定返回结果最多有多少条记录,默认值为 10,配合start实现分页
5,sort 排序方式,例如id desc 表示按照 “id” 降序
6,wt (writer type)指定输出格式,有 xml, json等
7,fq (filter query)过虑查询,提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果,例如:q=id:1&fq=sort:[1 TO 5],找关键字id为1 的,并且sort是1到5之间的。
8,df 默认的查询字段,一般默认指定。
9,h1 是否高亮,

3.3 客户端查询语法

  1. q查询关键字,查询所有使用:
    请求的q是字符串
    在这里插入图片描述
    多个条件可以:之间用 ANDOR 关联
    在这里插入图片描述
  2. fq (filter query)过滤查询,作用:在q查询符合结果中同时是fq查询符合的,例如:
    请求fq是一个数组(多个值)
    在这里插入图片描述
    过滤查询价格从1到1的记录。
    也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
    在这里插入图片描述
    也可以使用“*”表示无限,例如:
    10以上
    在这里插入图片描述
    10以下
    在这里插入图片描述
  3. sort 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]…. 示例:
    在这里插入图片描述
  4. start - 分页显示使用,开始记录下标,从0开始
    5. rows - 指定返回结果最多有多少条记录,配合start来实现分页。
    实际开发时,知道当前页码和每页显示的个数最后求出开始下标。
  5. fl - 指定返回那些字段内容,用逗号或空格分隔多个(回显)
    在这里插入图片描述
  6. df-指定一个搜索默认Field
    在这里插入图片描述在这里插入图片描述
  7. wt - (writer type)指定输出格式
    在这里插入图片描述
    9. hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
    在这里插入图片描述
    hl.fl 指定高亮域的名称

4 springboot集成solr

配置solrmaven坐标

4.1 springboot整合solr的maven配置如下

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

4.2 在application.yml配置文件中配置solr的Host地址

spring:
  data:
    solr:
      host: http://localhost:8081/solr/demo_core

4.3 准备实体类

这个实体类就是solr服务器的配置文件配置的字段。@Field注解是映射作用,Java实体类与solr索引的映射。

@Data
public class Products {
    @Field("id")
    private String pid;
    @Field("prod_pname")
    private String pname;
    @Field("prod_catalog_name")
    private String catalogName;
    @Field("prod_price")
    private Double price;
    @Field("prod_description")
    private String description;
    @Field("prod_picture")
    private String picture;
}

4.4 注入SolrClient对象

用法示例如下

@Autowired
 SolrClient solrClient;

4.4.1 springboot添加solr索引库(给solr数据库添加数据)

 public void addData() throws Exception{
       Products products=new Products();
       products.setPid("557");
       products.setPname("可爱的胖");
       products.setCatalogName("京东");
       products.setPrice(80.90);
       products.setDescription("很乖的宠物");
       products.setPicture("test.jpg");
       UpdateResponse updateResponse = solrClient.addBean(products);
       solrClient.commit();
       System.out.println("添加成功");
   }

4.4.2 springboot修改和上述的添加一样,有就修改,没有就添加

4.4.3 springboot删除solr索引库

public void delData() throws Exception{
       solrClient.deleteById("890");
       solrClient.commit();
//       solrClient.deleteByQuery("*:*");//先查询然后删除,*:* 这里查询条件是全部,因此执行之后会清空索引库
        System.out.println("删除成功");
    }

4.4.4 springboot查询solr索引库的数据

public void select() throws Exception{
        SolrQuery solrQuery=new SolrQuery("*:*");//查询所有
        QueryResponse query = solrClient.query(solrQuery);

        long numFound = query.getResults().getNumFound();
        System.out.println("总记录数:"+numFound);

        List<Products> beans = query.getBeans(Products.class);
        for(Products product:beans){
            System.out.println(product.getPid()+"  "+product.getPname()+"  "+product.getDescription());
        }
    }

4.4.5 模仿京东条件筛选搜索

 public void moreSelect() throws Exception{
       SolrQuery solrQuery=new SolrQuery();
       //q
       solrQuery.set("q","prod_pname:衣服");
       //fq:过滤查询
       solrQuery.setFilterQueries("prod_catalog_name:京东");
//       多条件过滤
//        solrQuery.setFilterQueries("prod_catalog_name:京东 or prod_catalog_name:淘宝");
        //价格过滤
//        solrQuery.addFilterQuery("prod_price:[10 TO *]");
        //排序sort
//        solrQuery.addSort("prod_price",SolrQuery.ORDER.asc);
        //分页(规则和limit一样)
        solrQuery.setStart(0);
        solrQuery.setRows(5);
        //回显(想查出来哪几个字段)
//        solrQuery.setFields("prod_name","pid");
        //高亮配置
        solrQuery.setHighlight(true);//启动高亮
        solrQuery.addHighlightField("prod_pname");//设置域名称
        solrQuery.setHighlightSimplePre("<font color='red'>");
        solrQuery.setHighlightSimplePost("</font>");

        QueryResponse query = solrClient.query(solrQuery);
        //得到高亮数据
        Map<String, Map<String, List<String>>> highlighting = query.getHighlighting();

        long numFound = query.getResults().getNumFound();
        System.out.println("总记录数:"+numFound);

        List<Products> beans = query.getBeans(Products.class);
        for(Products product:beans){

            Map<String, List<String>> stringListMap = highlighting.get(product.getPid());
            List<String> prod_pname = stringListMap.get("prod_pname");
            String pname = prod_pname.get(0);
            product.setPname(pname);//把名称重新赋值为高亮样式的名称
            System.out.println(product.getPid()+"  "+product.getPname()+" "+product.getCatalogName());
        }
    }

工程地址:https://github.com/fantongxue666/springboot-solr

猜你喜欢

转载自www.cnblogs.com/fantongxue/p/12704754.html
今日推荐