搜索引擎solr系列---与java的springboot项目连接配置

2023-11-07

java与solr连接,调用查询的方式,我知道的有两种:

  solrj方式:这种方式写法较麻烦,倒不是因为难,就是简单的逻辑,有时候为了一个业务写一堆代码,所以solrj的这种方式还是比较灵活的,能实现你需要的变态业务需求。我发现它的一个小缺点,就是相对于solr-jpa那种方式,它的速度稍慢一点。
  jpa方式:这种方式除了速度快点,基本没什么代码,都是自己搞好的,只要按照它的方式写就OK了,写法其实就是平时的jpa写法。缺点,其实我也不确定,对于一些稍微复杂的业务需求,我不知道它如何实现,本来我是用的这种方式,最后改成了solrj方式。
  推荐solrj吧,虽然写法有点傻,但是至少它能满足你的不同变态的要求。

solrj搭建的连接方法:

1.我是自己建立的spring boot项目单独用来做solr查询的,结构如下:

这里写图片描述

  首先,因为solr的查询结果我封装成了对象,facade项目是用于将来其他项目引用solr查询时与返回值匹配上。rest项目有具体的controller接口和具体的连接solr的实现逻辑。rest项目的pom同时引用了facade项目,保证外部引用和自己调用的接口以及对象的一致。
  该项目仓促,还不知道以后怎么调用,打算改成dubbo发布出接口那种,现在还没改,主要写一下solrj的连接方式。其他都靠自己去设计了。

2.引入的jar包如下:

<!--parent标签是spring boot的统一引入的一种方式,如果你像我还有一个parent项目,那需要将下边的parent标签内容移到parent项目中,将其他的引入到rest项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
 <dependencies>
 <!--spring boot项目必须引入的依赖web-->
<dependency>           
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring boot项目引入的solr的依赖-->
<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-solr</artifactId>
 </dependency>
 <!--下边的这个依赖可以不用引用,我是让前端给我传的参数是以HttpServletRequest形式传入的-->
 <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
 </dependency>
</dependencies>

3.这里不写我是如何在spring boot项目中放置的,源码在该文章最下边可以下载,只以一个main方法的形式,贴出solr的从连接到查询的部分。

package cloud.solr.domain;
//实体类
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;
import java.io.Serializable;
@SolrDocument(solrCoreName="fbf") //solrj不需要加这个,加上也不报错,我主要是该项目jpa和solrj都可以,我就把实体类弄成了这样。
public class Fbf implements Serializable {
    @Id
    @Field
    private String poid; //主键需要加两个注解
    @Field 
    private String fbfbm; //普通的属性加Field注解即可
    @Field
    private String fbfmc;
//省略get和set方法
}
package cloud.solr.controller;
import cloud.solr.domain.Fbf;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.solr.client.solrj.SolrQuery;
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.SolrDocumentList;
import org.apache.solr.common.StringUtils;
import java.io.IOException;
import java.util.List;
import org.springframework.web.bind.annotation.*;
/**
 * Created by lsf on 2017/10/17.
 */
@RestController
@RequestMapping("/testSolr")
public class TestController {
public static void main(String[] args){
   /**
    * http://192.168.1.170:8983/solr/fbf   fbf是solr的一个core名称
    */
   HttpSolrClient solrClient = new HttpSolrClient("http://192.168.1.170:8983/solr/fbf");
   SolrQuery query = new SolrQuery();
   query.setSort("createtime",SolrQuery.ORDER.asc); //设置排序参数及排序规则
   String pageNo = "1";  //第几页
   String pageSize = "10"; //每页多少数据
   if(NumberUtils.isNumber(pageNo) && NumberUtils.isNumber(pageSize)){
       int startPage = Integer.valueOf(pageNo);
       int pageNum = Integer.valueOf(pageSize);
       query.setStart((startPage-1)*pageNum);//起始页,这里一定要注意,不能直接把pageNo赋值给start,start表示从第一个数据开始,第一条从0开始。
       query.setRows(pageNum);//每页显示数量
   }
   StringBuffer buffer = new StringBuffer();
   String fbfmc = "何寨街道季家村高北组"; //查询条件
   if(!StringUtils.isEmpty(fbfmc)){
       buffer.append("fbfmc:"+fbfmc); //如果你的fbfmc字段在solrHome/fbf/conf/manage-schema文件中定义的类型是text_ik,即已经分词了,那么这里可以这么写,如果你定义的是string类型,即没有分词,那这句话的append中的内容需要写成这样buffer.append("fbfmc:*"+fbfmc+"*"),这是solr的查询规则,没有分词最好是加上模糊查询符号"*"
       query.set("q",buffer.toString());
   }else{
       query.set("q","*:*"); //没有传入参数则全部查询
   }
   QueryResponse rsp = null;
   try {
       rsp = solrClient.query( query );
   } catch (Exception e) {
       e.printStackTrace();
   }
   SolrDocumentList results = rsp.getResults();
   System.out.println(results.getNumFound());//查询总条数,该总条数是符合该条件下的总条数,并不是pageSize的数量。
   List<Fbf> fbfList = rsp.getBeans(Fbf.class);//该方法将返回结果转换为对象,很方便。
   System.out.println(fbfList.get(0).getFbfmc());
    }
}

其他常用的方法:

添加方法---是调用solrClient.addBean(Fbf fbf);
根据id查询方法---是调用solrClient.getById(id); //注意它返回值是SolrDocument,可以直接返回给前端,就是key value那种形式。
删除方法---是调用solrClient.deleteById(id);
没有修改方法,只能结合删除和添加来完成修改操作。

说明:
 (1)关于solrj的查询出错,主要是查询参数的传入格式,就像上边的地方,如果fbfmc设置成了分词类型,千万不要再加*,如果是string类型就需要加上*才可以。
 (2)如果你不想再封装成对象,那么你可以直接给前端返回SolrDocumentList results = rsp.getResults();,也就是SolrDocumentList对象即可。
 (3)solrj的连接地址,要具体到某一个core名称上,比如上边的http://192.168.1.170:8983/solr/fbf 连接到了fbf这个core上。

spring boot solr jpa搭建的连接方法:

1.首先引入的jar包与上边的一样,具体也可以看我的项目,下载位置在最下边

2.找到spring boot项目的application.properties文件,添加如下代码:

这个是连接solr的客户端的地址

spring.data.solr.host=http://192.168.1.170:8983/solr

3.添加实体类、jpa查询逻辑类等(以下代码与我的项目源码稍有不同,具体参照项目的下边的写法,我稍微改动了下)

package cloud.solr.domain;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;
import java.util.Date;

@SolrDocument(solrCoreName="product") //jpa是在这里与具体的core关联的,所以这个必须加
public class Product {
    @Id
    @Field
    private String id; //主键必须加这两个注解
    @Field
    private String name; //其他属性加一个注解
    @Field
    private String pic;
    @Field
    private double price;
    @Field
    private long comment;
    //省略get和set方法
    }

controller类

package cloud.solr.controller;

import cloud.solr.controller.base.BaseController;
import cloud.solr.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;

/**
 * Created by Administrator on 2017/10/17.
 */
@RestController
public class ProductController extends BaseController{
@Autowired
ProductService productService;
//根据名称查询
@RequestMapping(value = "/selectByName",method = RequestMethod.GET)
@CrossOrigin
public Object SelectObjectByName(HttpServletRequest request){
    return productService.findByName(request.getParameter("name"));
}
//根据名称查询,并且分页
@RequestMapping(value = "/select",method = RequestMethod.GET)
@CrossOrigin
public Object SelectObject(HttpServletRequest request){
    try {
//getPageRequest方法在父类里写了,就是一个封装Pageable对象的方法,具体在下边贴出来。
        return productService.query(request.getParameter("name"),getPageRequest(request));
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
}

在父类中的getPageRequest方法

/**
* 获取分页请求
*/
protected PageRequest getPageRequest(HttpServletRequest request){
int page = 1;
int size = 10;
Sort sort = null;
try {
String sortName = request.getParameter("sortName");
String sortOrder = request.getParameter("sortOrder");
if(StringUtils.isNotBlank(sortName) ){
   if("desc".equalsIgnoreCase(sortOrder)){
       sort = new Sort(Sort.Direction.DESC, sortName);
   }else{
       sort = new Sort(Sort.Direction.ASC, sortName);
   }
}
page = Integer.parseInt(request.getParameter("pageNo")) - 1;
size = Integer.parseInt(request.getParameter("pageSize"));
} catch (Exception e) {
e.printStackTrace();
}
if(sort == null){
sort = new Sort(Sort.Direction.ASC, "id");
}
PageRequest pageRequest = new PageRequest(page, size, sort);
return pageRequest;
}

Service类

package cloud.solr.service;
import cloud.solr.domain.Product;
import cloud.solr.repository.ProductRepository;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;

@Service
public class ProductService {
    @Autowired
    ProductRepository productRepository;

    public List<Product> findByName(String name){
        if(StringUtils.isEmpty(name)){
            return new ArrayList<>();
        }
        return productRepository.findByName(name);
    }
    public void save(Product product){
        if(product != null) {
            productRepository.save(product);
        }
    }
    public Page<Product> query(String queryString, Pageable pageable) throws Exception {
        return productRepository.findByNameContaining(queryString, pageable);
    }
}

repository类(注意:重点来了

package cloud.solr.repository;
import cloud.solr.domain.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;
import java.util.List;

public interface ProductRepository extends SolrCrudRepository<Product, String> {
//如果要与名字精确匹配,则如下写法,其中Name为具体的属性名称,如果包含查询,模糊查询则findByNameContaining即可。写法与jpa写法一致。也要注意下solrHome中的manage-schema文件对属性类型的配置是text_ik还是string类型。
List<Product> findByName(String name);

//可以把@Query注释掉findByNameContaining就变成了 name:*?0*,仅按名称匹配
//@Query(value = "name:*?0* or category:*?0*")
Page<Product> findByNameContaining(String name, Pageable pageable);
}

jpa的写法都是一样的,可以从网上看下具体的写法,最下边我可以下载的项目里jpa这种写法我给注释掉了,应该都很容易看懂的。

我的spring boot项目源码下载地址
下一篇写高亮查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索引擎solr系列---与java的springboot项目连接配置 的相关文章

  • SOLR 中的子字符串匹配

    我似乎无法弄清楚如何使用 SOLR 查找子字符串匹配 我已经根据前缀找出了匹配 这样我就可以让火腿与汉堡包匹配 我如何搜索 汉堡 来匹配汉堡包 我试过burger但这引发了错误 或 不允许作为 WildcardQuery 中的第一个字符 如
  • Solr 索引与存储

    我对太阳能场的索引和存储属性的行为有点困惑 例如 如果我在 Schema xml 中有以下内容
  • Solr 和方面搜索

    当您设置模式时 分面搜索是否内置 或者您是否必须做一些事情来设置它 它基本上可以在您设置为可排序的所有字段上开箱即用吗 那么您只需使用 fq 查询语法 它就会返回构面 xml 以及搜索结果 有没有一篇关于这方面的好文章对您第一次有帮助 是的
  • 更改 SOLR 默认连接

    我正在使用嵌入 SOLR 的应用程序 SOLR 在 Tomcat 的 webapp 区域中像一场战争一样运行 是否有 SOLR 配置允许我切换搜索的默认 SOLR 行为以假定 AND 而不是 OR 作为连接运算符 在您的模式文件中添加 或修
  • 如何使用 pysolr 对 solr 进行原子更新?

    我找不到关于如何使用 pysolr 更新 solr 的合适文档 截至 2014 年 11 月原子更新 https github com toastdriven pysolr commit c49be48d459448532b5ad0f505
  • 对 solr 搜索结果进行排序。给出错误无法对多值字段进行排序:名称

    我对 Apache Solr 搜索比较陌生 我正在尝试对 Solr 查询中的结果集进行排序 查询 名称 abc AND 隐藏 false sort name desc 它显示错误 无法对多值字段进行排序 名称 Solr版本是 7 2 1 如
  • Solr 4.0 中的 BaseTokenFilterFactory 去哪儿了?

    用于创建您自己的标记和字符过滤器的 Solr 文档说明如下 http wiki apache org solr AnalyzersTokenizersTokenFilters Specifying an Analyzer in the sc
  • ckan本地安装,solr JSP支持未配置500错误

    我正在尝试使用 Ubuntu 14 04 LTS 在本地计算机上安装 CKAN 我按照从找到的源安装的说明进行操作here http docs ckan org en latest maintaining installing instal
  • Solr MoreLikeThis 不适用于多个分片?

    我在 SolrCloud 中有 5 个节点集群 每个节点有 2 个分片 Solr版本 6 3 0 现在 当我运行 mlt 查询时 它仅返回每个节点的结果 并且不会将它们分布在所有分片 节点上 即 没有给出任何结果 给出结果 我什至尝试将其指
  • solr + haystack + django 我在哪里放置 schema.xml?

    我刚刚安装Solr and Haystack for a Django我正在做的项目 下列的this http docs haystacksearch org dev tutorial html Haystack教程 我创建了一个 sche
  • cursorMark是无状态的以及它如何解决深度分页

    作为指定here https cwiki apache org confluence display solr Pagination of Results光标标记是无状态的 但我不明白它是如何解决无状态的深度分页问题的 solr 是否按唯一
  • Solr 在 TrieDateField 上按年份过滤

    我的 Solr 模式有一个字段类型tdate班级的solr TrieDateField
  • 从 Solr Admin 删除 solr 文档

    如何使用 SOLR Admin 删除 SOLR 索引中的所有文档 我尝试使用该网址并且它有效 但想知道是否可以使用管理员来完成相同的操作 使用下面的查询之一DocumentSolr 管理 UI 选项卡 XML
  • 用于标签搜索的数据存储解决方案

    我已经按照预先计算的分数订购了数百万件商品 每个项目都有许多布尔属性 假设总共有大约一万个可能的属性 每个项目有十几个 我希望能够请求实时 几毫秒 给定任意属性组合的前 n 个项目 您会推荐什么解决方案 我正在寻找可扩展性极强的东西 我们目
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • Solr 不搜索整数?

    我目前正在使用 Solr 为电子商务网站开发搜索引擎 所以我在 schema xml 中得到这两个字段
  • 加速 SOLR 搜索

    使用 SOLR Apache Lucene 3 6 时 SOLR 搜索响应非常慢 我正在尝试的一些性能增强技术是 SOLR 分页 mergeFactor 当前在 solrConfig xml 中设置为 10 SOLR 方面查询 solrco
  • 在 Ecom 应用程序中实施 SOLR 的最佳实践是什么?

    我是 SOLR 的新用户 我正在开发一个具有 SQL 数据库的电子商务 Web 应用程序 我想在应用程序中为我的 类别页面 实现 SOLR 我们将在其中显示该类别的产品以及特定信息 例如可用库存 价格和更多详细信息 此外 我们希望根据库存情
  • 在 solr 的类路径中找不到资源“solrconfig.xml”

    problem 我无法访问 solr 管理页面 当我在本地系统上运行 url 时 response
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal

随机推荐

  • gre 填空78-89

    section 78 median 1 Kinetic dynamic energizing Immutable not capable of or susceptible to change 2 It is often argued th
  • idea build 报错,maven install 正常运行

    pom中引的包 代码写的时候也有提示 写完也不报错 build 或者 run 或者 debug 启动就报错 提示程序包xxx无法找到 原来是idea 自身的问题 首先执行maven 命令 mvn idea idea 再点击idea的菜单fi
  • 被包围的棋子 Surrounded Regions

    问题 Given a 2D board containing X and O capture all regions surrounded by X A region is captured by flipping all O s into
  • 浅谈MVC(jsp+servlet+JavaBean简单实例)

    MVC Model View Controller 旨在分离模型 控制 视图 是一种分层思想的体现 项目实例 购物车商品管理 总体设计 1实现DBHelper类 2创建实体类 3创建业务逻辑类 DAO 4创建控制层 5创建页面层 1数据库连
  • Android面试回忆录:Service有几种启动方式?,android开发工程师

    如果需要做耗时的操作 你会怎么做 问题便这样展开了 一个人是否真正懂得原理会灵活运用 一下子便能看出来 当面试者回答到线程和Handler方式时 我会再问一下对方 是否知道IntentService 在什么场景下使用IntentServic
  • 文件操作之文件下载、文件读取

    本文章仅做学习交流 如有违法行为 上传者自行负责 原理 原理案例 检测 怎么寻找文件下载漏洞 利用方面 文件目录的获取分两种 文件类型 常见文件 敏感文件 实际案例演示 Javaweb文件下载代码 当贝市场 通过功能点找到漏洞 RoarCT
  • win10下使用mmdet训练自己的数据模型

    win10下使用mmdet训练自己的数据模型 1 环境配置 2 制作自己的coco数据集 3 进行训练 4 计算测试图像的交并比 参考文献 1 环境配置 1 查看自己cuda版本 2 查看自己python版本 3 安装pytorch 官方地
  • 项目实训(树莓派)(七)树莓派4B下的ubuntu系统下命令行的使用-磁盘管理部分

    目录 前言 实验目的 实验内容 实验环境 实验步骤 1 df命令 2 fdisk命令 磁盘分区 3 hdparm命令 显示与设定硬盘参数 4 lsblk命令 查看系统的磁盘 5 vgextend命令 扩展卷组 前言 通过前面的实验 我们已经
  • 【MySQL笔记】正确的理解MySQL的MVCC及实现原理

    MVCC多版本并发控制 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 首先声明 MySQL 的测试环境是 5 7 前提概要 什么是 MVCC 什么是当前读和快照读 当前读 快照读和 MVCC 的关系 MVCC
  • 数字水印技术

    数字水印技术在信息安全中属于数字版权保护方面的技术 数字水印通过嵌入或附加数字信息到数字媒体中 可以追踪和证明数字媒体的来源 版权 真伪等 数字水印可以被用于防止盗版 保护知识产权 证明数字证据的真实性等应用场景 从而保障信息安全和维护合法
  • jQuery学习

    1 jQuery概述 1 1 JavaScript 库 JavaScript 库 即library 是一个封装好的特定的集合 方法和函数 从封装一大堆函数的角度理解库 就是在这个库中 封装了很多预先定义好的函数在里面 比如动画animate
  • BAJT 中高级 Java 面试题答案

    1 请问你做过哪些JVM优化 使用什么方法达到什么效果 vm调优主要也就是内存空间的分配 最终策略 提高系统性能 主要策略有 1 增加eden空间 让更多的对象留在年轻代 2 大对象直接放到老年代 以免扰乱年轻代高频率的gc XX Pete
  • 怎么查找电脑中的流氓软件_1个神器彻底删除流氓软件,瞬间清出十几个G,你的电脑有救了!...

    在使用电脑中 我们总会遇到一些流氓软件 不仅严重拖慢了电脑的运行速度 还不定时地弹出一个又一个的 定时炸弹 毋庸置疑 这些定时炸弹就是各种烦人的广告和弹窗了 尽管我们通过常规的方式把它卸载 但它还会卷土重来 那么对于那些卸载了仍会有文件残留
  • SpringCloud:SpringCloud生态的组成,组件的介绍(一)

    springCloud官方文档 https www springcloud cc 中文网 https spring io projects spring cloud 官方网 SpringCloud是什么 Spring Cloud是一个基于S
  • 一文读懂:区块链中的Merkle树

    我们知道 区块链中每个区块包括区块头和区块体两部分 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 像在CSDN一样 分享技术 分享代码 分享方案文档 分享白皮书 区块体中包含了由区块链系统产生的一系列交易数据 并以Merk
  • SLAM入门

    SLAM定义 SLAM Simultaneous localization and mapping 同时定位 我在哪里 与建图 我周围有什么 当某种移动设备 汽车 扫地机 手机 无人机 机器人 从一个未知环境的未知地点出发 在运动过程中 通
  • P27 多表查询的分类:非等值连接、自连接、内、外连接

    3 多表查询的分类 7 多表查询的分类 角度1 等值连接 vs 非等值连接 角度2 自连接 vs 非自连接 角度3 内连接 vs 外连接 等值连接 vs 非等值连接 SELECT FROM job grades 非等值连接 薪资是在一个范围
  • airpods固件更新方法_AirPods2/AirPods Pro新固件怎么升级 固件更新方法

    17日上午 苹果公司发布了针对 AirPods 2 和 AirPods Pro 两款无线耳机的的固件更新 不过目前官方并未说明此次更新的具体改进 AirPods Pro 是苹果 10 月底推出的新品 支持主动降噪功能 在今天之前 它的固件版
  • MySQL数据库基本概念介绍

    MySQL数据库 一 数据库的简介 1 数据 Data 2 表 3 数据库 二 数据库的概念 1 数据库管理系统 DBMS 2 数据库系统 三 数据库的发展史 1 第一代数据库 2 第二代数据库 3 第三代数据库 四 当前主流数据库介绍 1
  • 搜索引擎solr系列---与java的springboot项目连接配置

    java与solr连接 调用查询的方式 我知道的有两种 solrj方式 这种方式写法较麻烦 倒不是因为难 就是简单的逻辑 有时候为了一个业务写一堆代码 所以solrj的这种方式还是比较灵活的 能实现你需要的变态业务需求 我发现它的一个小缺点