一篇文章上手《全文检索引擎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-7.7.2.zip版本,解压后

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

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

启动

solr start

不愿配置环境遍历的

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

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

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

Solrçé¢åè½1

Solrçé¢åè½5

spring boot中使用

在solr页面创建core

solr create -c demo

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

进入conf目录下:

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

基础配置完成

spring boot项目中增删改查数据

spring boot中添加solr依赖

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

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<UserSolr> addUser();
}

SolrServiceImpl

@Service
public class SolrServiceImpl implements SolrService {

    @Override
    public List<UserSolr> addUser() {
        List<UserSolr> 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<UserSolr> 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<String> fieldNames = solrDocument.getFieldNames();
        //获取file名和内容
        Map<String, Object> fieldValueMap = solrDocument.getFieldValueMap();

//            int childDocumentCount = solrDocument.getChildDocumentCount();

        List<SolrDocument> 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<Object> 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<String, String> queryParamMap = new HashMap<String, String>();
//        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("<font color='red'>");
        solrQuery.setHighlightSimplePost("</font>");
        System.out.println(solrQuery);
        QueryResponse response = solrClient.query(solrQuery);
        //返回高亮显示结果
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
        //response.getResults();查询返回的结果
        SolrDocumentList documentList = response.getResults();
        for (SolrDocument solrDocument : documentList) {
            System.out.println("solrDocument==============" +solrDocument);
        }
        return documentList;
    }

}

开始测试:

单个增加:

成功

批量增加

根据di删除

根据di查询

 

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

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

发布了53 篇原创文章 · 获赞 768 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/tangcv/article/details/103856243
今日推荐