一篇文章上手《全文检索引擎Solr》

Solr介绍

Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自动故障转移和恢复,集中式配置等。Solr为许多世界上最大的互联网站点提供搜索和导航功能。

Solr是具有REST类API的独立企业搜索服务器。您可以通过JSON,XML,CSV或HTTP二进制文件将文档放入其中(称为“索引编制”)。您通过HTTP GET查询它,并接收JSON,XML,CSV或二进制结果。

先进的全文本搜索功能

在Lucene ™的支持下,Solr实现了强大的匹配功能,包括短语,通配符,联接,分组等等,跨任何数据类型

针对大流量进行了优化

Solr已在全球范围内得到广泛验证

基于标准的开放接口-XML,JSON和HTTP

Solr使用您用来使应用程序构建快速的工具

全面的管理界面

Solr附带内置的响应式管理用户界面,可轻松控制您的Solr实例

易于监控

需要深入了解您的实例吗?Solr通过JMX发布负载指标数据

高度可扩展和容错

Solr建立在经过实战检验的Apache Zookeeper之上,可以轻松地上下扩展。Solr开箱即用地进行复制,分发,重新平衡和容错。

灵活且适应性强,配置简单

Solr's旨在满足您的所有需求,同时简化配置

近实时索引

想立即查看您的更新吗?Solr利用Lucene的近实时索引功能来确保您在看到内容时能够看到它

可扩展的插件架构

Solr发布了许多定义明确的扩展点,这些扩展点使插入索引和查询时间插件变得容易。当然,由于它是Apache许可的开放源代码,因此您可以更改所需的任何代码!

安装

官网下载地址:http://lucene.apache.org/solr/downloads.html

下载速度可以快很多:https://download.csdn.net/download/tangcv/12084451

windows环境下载

一篇文章上手《全文检索引擎Solr》_第1张图片

我的是solr-7.7.2.zip版本,解压后

一篇文章上手《全文检索引擎Solr》_第2张图片

bin:solr的命令文件
contrib:solr的插件
dist: solr的jar包
docs: solr文档
example: solr示例
licenses: solr证书
server: solr服务器核心文件

配置环境变量方便启动:solr的bin目录

一篇文章上手《全文检索引擎Solr》_第3张图片

启动

solr start

不愿配置环境遍历的

//进入solr bin目录
solr.cmd start

一篇文章上手《全文检索引擎Solr》_第4张图片

其它命令
solr start –p 端口号 单机版启动solr服务(默认端口号8983)
solr restart –p 端口号 重启solr服务
solr stop –p 端口号关闭solr服务

打开网页http://localhost:8983访问进入solr页面即安装完成。

一篇文章上手《全文检索引擎Solr》_第5张图片

Solrçé¢åè½1

Solrçé¢åè½5

spring boot中使用

在solr页面创建core

solr create -c demo

一篇文章上手《全文检索引擎Solr》_第6张图片

 

一篇文章上手《全文检索引擎Solr》_第7张图片

此时在solr目录下会生成一个demo文件:

一篇文章上手《全文检索引擎Solr》_第8张图片

进入conf目录下:

一篇文章上手《全文检索引擎Solr》_第9张图片

在Solr的配置文件里,有两个文件很重要,一个是solrconfig.xml,还有一个就是schema.xml,Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,在之后的版本中,生成的managed-schema就是schema.xml,直接把managed-schema文件重命名为schema.xml

一篇文章上手《全文检索引擎Solr》_第10张图片

基础配置完成

spring boot项目中增删改查数据

spring boot中添加solr依赖


    org.springframework.boot
    spring-boot-starter-data-solr

yml配置solr端口信息

spring:
  data:
    solr:
      host: http://localhost:8983/solr/demo

添加实体类 UserSolr

import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;

import java.io.Serializable;

/**
 * @author :抽象书生
 * @date :Created in 2020/1/6 9:34
 * @Time: 9:34
 * @description:搜素引擎实体类
 * @modified By:
 * @version: 1.0$
 */
@Data
public class UserSolr implements Serializable {

    //必须实现可序列化接口,要在网络上传输
    @Field("id")//使用这个注释,里面的名字是根据你在solr数据库中配置的来决定
    private String id;

    @Field("item_name")
    private String name;

    @Field("item_sex")
    private String sex;

    @Field("item_address")
    private String address;

    @Field("item_host")
    private Integer host;

}

SolrService

public interface SolrService {

    List addUser();
}

SolrServiceImpl

@Service
public class SolrServiceImpl implements SolrService {

    @Override
    public List addUser() {
        List list = new ArrayList<>();
        UserSolr user = new UserSolr();
        for (int i = 0; i <5 ; i++) {
            user.setId(UUID.randomUUID().toString().replace("-",""));
            user.setName("jack"+i);
            if( i % 2 ==0) {
                user.setSex("男");
            }else {
                user.setSex("女");
            }
            user.setAddress("兰州市安宁区666"+i);
            user.setHost(73040+i);
            list.add(user);
        }
        return list;
    }
}

SolrController


import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.aop.log.Log;
import me.zhengjie.domain.UserSolr;
import me.zhengjie.service.SolrService;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.util.NamedList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;


@Slf4j
@Controller
@RequestMapping("/api/solr")
@Api(tags = "工具:搜索引擎")
@Component
public class SolrController {

    @Autowired
    private SolrService solrService;

    @Autowired
    private SolrClient solrClient;

    //批量增加
    @GetMapping("/addUsers")
    @Log("批量增加")
    @ApiOperation("批量增加")
    @ResponseBody
    public void addUsers() throws IOException, SolrServerException {
        List users = solrService.addUser();

        solrClient.addBeans(users);
        solrClient.commit();
    }
    //单个增加
    @GetMapping("/addUser")
    @Log("单个增加")
    @ApiOperation("单个增加")
    @ResponseBody
    public void addUser() throws IOException, SolrServerException {
        UserSolr user = new UserSolr();
        user.setId("456788");
        user.setName("王强");
        user.setAddress("北京市");
        user.setSex("女");
        user.setHost(456752);
        solrClient.addBean(user);
        solrClient.commit();
    }

    //根据di查询
    @GetMapping("/getByIdFromSolr/{id}")
    @Log("根据di查询")
    @ApiOperation("根据di查询")
    @ResponseBody
    public  void getByIdFromSolr(@PathVariable("id") String id) throws IOException, SolrServerException {

        //根据id查询内容
        SolrDocument solrDocument = solrClient.getById(id);
        //获取filedName
        Collection fieldNames = solrDocument.getFieldNames();
        //获取file名和内容
        Map fieldValueMap = solrDocument.getFieldValueMap();

//            int childDocumentCount = solrDocument.getChildDocumentCount();

        List childDocuments = solrDocument.getChildDocuments();

        System.out.println("byId=================="+solrDocument);
        System.out.println("fieldNames=================="+fieldNames);
        System.out.println("fieldValueMap=================="+fieldValueMap);
//            System.out.println("childDocumentCount=================="+childDocumentCount);
        System.out.println("childDocuments=================="+childDocuments);

    }
    //根据di删除
    @DeleteMapping("/delById/{id}")
    @Log("根据di删除")
    @ApiOperation("根据di删除")
    @ResponseBody
    public  void  delById(@PathVariable("id") String id) throws IOException, SolrServerException {
        //根据id删除信息
        UpdateResponse updateResponse = solrClient.deleteById(id);
        //执行的时间
        long elapsedTime = updateResponse.getElapsedTime();

        int qTime = updateResponse.getQTime();
        //请求地址
        String requestUrl = updateResponse.getRequestUrl();
        //请求的结果{responseHeader={status=0,QTime=2}}
        NamedList response = updateResponse.getResponse();
        //请求结果的头{status=0,QTime=2}
        NamedList responseHeader = updateResponse.getResponseHeader();
        //请求的状态 0
        int status = updateResponse.getStatus();

        System.out.println("elapsedTime==========="+elapsedTime);
        System.out.println("qTime==========="+qTime);
        System.out.println("requestUrl==========="+requestUrl);
        System.out.println("response==========="+response);
        System.out.println("responseHeader==========="+responseHeader);
        System.out.println("status==========="+status);
    }

    @GetMapping("/queryFromSolr")
    @Log("queryFromSolr")
    @ApiOperation("queryFromSolr")
    public  Object  queryFromSolr() throws IOException, SolrServerException {
        //第一种方式
//        Map queryParamMap = new HashMap();
//        queryParamMap.put("q", "*:*");
//        queryParamMap.put("f1","id,name");
//        queryParamMap.put("sort","id asc");
//        MapSolrParams mapSolrParams = new MapSolrParams(queryParamMap);
//        solrClient.query(mapSolrParams);

        //第二种方式
        SolrQuery solrQuery  = new SolrQuery();
        solrQuery.setQuery("*:*");
//        solrQuery.addField("*");
        solrQuery.add("q","id:4567");

        solrQuery.setSort("id", SolrQuery.ORDER.asc);
        //设置查询的条数
        solrQuery.setRows(50);
        //设置查询的开始
        solrQuery.setStart(0);
        //设置高亮
        solrQuery.setHighlight(true);
        //设置高亮的字段
        solrQuery.addHighlightField("item_name");
        //设置高亮的样式
        solrQuery.setHighlightSimplePre("");
        solrQuery.setHighlightSimplePost("");
        System.out.println(solrQuery);
        QueryResponse response = solrClient.query(solrQuery);
        //返回高亮显示结果
        Map>> highlighting = response.getHighlighting();
        //response.getResults();查询返回的结果
        SolrDocumentList documentList = response.getResults();
        for (SolrDocument solrDocument : documentList) {
            System.out.println("solrDocument==============" +solrDocument);
        }
        return documentList;
    }

}
 
    

开始测试:

一篇文章上手《全文检索引擎Solr》_第11张图片

单个增加:

一篇文章上手《全文检索引擎Solr》_第12张图片

成功

一篇文章上手《全文检索引擎Solr》_第13张图片

 

批量增加

一篇文章上手《全文检索引擎Solr》_第14张图片

根据di删除

一篇文章上手《全文检索引擎Solr》_第15张图片

根据di查询

一篇文章上手《全文检索引擎Solr》_第16张图片

 

 

本文参考:http://lucene.apache.org/solr/

本文参考:https://blog.csdn.net/weixin_42129558/article/details/82682265

 

 

你可能感兴趣的:(JAVA,中间件,springBoot)