全文搜索服务器Solr实例demo

Elasticsearch、Solr、MeiliSearch与PostgreSQL全文搜索实战对比与避坑指南 全文搜索是处理海量文本数据、实现高效模糊匹配和相关性排序的核心技术,其底层依赖于倒排索引机制。该机制通过建立词条到文档的映射,相比传统数据库的LIKE查询,能实现毫秒级检索响应。这项技术为现代应用提供了从电商商品搜索、内容平台推荐到日志分析等场景的关键支撑。在实际工程实践中,开发者常面临在Elasticsearch、Solr、MeiliSearch及数据库内置方案间的选型困惑。本文聚焦于倒排索引与中文分词等核心热词,通过对比这四种主流方案在Docker环境下的配置、API集成及生产级优化策略,旨在为面临搜索 阅读详情

http://cpf1985.iteye.com/blog/1074238

http://cpf1985.iteye.com/blog/1074265


其中solr服务类:

   package com.cpf.service;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.FactoryFinder;

import org.apache.lucene.document.Document;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
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 com.cpf.model.Good;


public class SolrService {
	 private static SolrServer solrServer;
	 public  SolrService(String solrUrl){
		 try {
			solrServer= new CommonsHttpSolrServer(solrUrl);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	 }
	 
	 public void createIndexs(List<Good> list){
		 List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
		 for(Good good :list){
			 SolrInputDocument doc= new SolrInputDocument(); 
			 doc.addField("id", good.getGood_id());
			 doc.addField("merchant_id", good.getGood_id());
			 doc.addField("region_id", good.getRegion_id());
			 doc.addField("good_name", good.getGood_name());
			 doc.addField("good_no", good.getGood_no());
			 doc.addField("barcode", good.getBarcode());
			 doc.addField("good_desc", good.getGood_desc());
			 doc.addField("price", good.getPrice());
			 doc.addField("num", good.getNum());
			 doc.addField("typeId", good.getTypeId());
			 doc.addField("typeName", good.getTypeName());
			 docs.add(doc);
		 }
		 try {
			solrServer.add(docs);
			solrServer.optimize();
			solrServer.commit();
		} catch (Exception e) {
		
			e.printStackTrace();
		} 
		 
	 }
	 public List<Good> search(String key){
		 List<Good> goodList= new ArrayList<Good>();
		 SolrQuery query= new SolrQuery();
		 query.setQuery("good_desc:"+key);
		 query.setRows(20);
		 query.setHighlight(true);
	        // 设置高亮区域
	     query.addHighlightField("good_desc");
	        // 设置高亮区域前缀
	     query.setHighlightSimplePre("<font color=\"red\">");
	        // 设置高亮区域后缀
	     query.setHighlightSimplePost("</font>");
		// query.setFacet(true);
		 QueryResponse rsp = null;
			try {
				rsp = solrServer.query(query);
			
			} catch (SolrServerException e) {
				e.printStackTrace();
			}
			SolrDocumentList documentList=rsp.getResults();
			@SuppressWarnings("unused")
			Map<String, Map<String,List<String>>> map=rsp.getHighlighting();
			
			Iterator<SolrDocument> list=documentList.iterator();
			
			while(list.hasNext()){
				SolrDocument doucment=list.next();
				Good good= new Good();
				String goodId=String.valueOf(doucment.get("id"));
				String goodName=(String) doucment.get("good_name");
				String goodDesc=(String) doucment.get("good_desc");
				if(map.get(goodId)!=null && map.get(goodId).size()>0){
				   	if(map.get(goodId).get("good_desc")!=null){
				   		goodDesc=map.get(goodId).get("good_desc").get(0);
				   	}
				}
				good.setGood_id(Integer.parseInt(goodId));
				good.setGood_name(goodName);
				good.setGood_desc(goodDesc);
				goodList.add(good);
			}
			
		 return goodList;
	 }
	 public void delIndex(){
		 try {
			solrServer.deleteByQuery("*:*");
			solrServer.commit();//要记得提交数据
		} catch (Exception e) {
			e.printStackTrace();
		} 
	 }
	public static SolrServer getSolrServer() {
		return solrServer;
	}
	public static void setSolrServer(SolrServer solrServer) {
		SolrService.solrServer = solrServer;
	}
	 
}

**************************************************************************************************************************


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;

public class SolrHttpServer {
	//private Logger logger = LoggerFactory.getLogger(this.getClass());
	private final static String URL = "http://localhost:8080/solr";
	private final static Integer SOCKE_TTIMEOUT = 1000; // socket read timeout
	private final static Integer CONN_TIMEOUT = 100;
	private final static Integer MAXCONN_DEFAULT = 100;
	private final static Integer MAXCONN_TOTAL = 100;
	private final static Integer MAXRETRIES = 1;
	private static CommonsHttpSolrServer server = null;
	private final static String ASC = "asc";
	
	public void init() throws MalformedURLException {
			server = new CommonsHttpSolrServer( URL );
			//server.setParser(new XMLResponseParser());
			server.setSoTimeout(SOCKE_TTIMEOUT);
			server.setConnectionTimeout(CONN_TIMEOUT);
			server.setDefaultMaxConnectionsPerHost(MAXCONN_DEFAULT);
			server.setMaxTotalConnections(MAXCONN_TOTAL);
			server.setFollowRedirects(false);
			server.setAllowCompression(true);
			server.setMaxRetries(MAXRETRIES);
	}
	
	public static SolrDocumentList query(Map<String, String> property, Map<String, String> compositor, Integer pageSize) throws Exception {
		SolrQuery query = new SolrQuery();
		// 设置搜索字段
		if(null == property) {
			throw new Exception("搜索字段不可为空!");
		} else {
			for(Object obj : property.keySet()) {
				StringBuffer sb = new StringBuffer();
				sb.append(obj.toString()).append(":");
				sb.append(property.get(obj));
				String sql = (sb.toString()).replace("AND", " AND ").replace("OR", " OR ").replace("NOT", " NOT ");
				query.setQuery(sql);
			}
		}
		// 设置结果排序
		if(null != compositor) {
			for(Object obj : compositor.keySet()) {
				if(ASC == compositor.get(obj) || ASC.equals(compositor.get(obj))) {
					query.addSortField(obj.toString(), SolrQuery.ORDER.asc);
				} else {
					query.addSortField(obj.toString(), SolrQuery.ORDER.desc);
				}
			}
		}
		if(null != pageSize && 0 < pageSize) {
			query.setRows(pageSize);
		}
		QueryResponse qr = server.query(query);
		SolrDocumentList docList = qr.getResults();
		return docList;
	}
	
	public static Map<String, String> getQueryProperty(Object obj) throws Exception {
		Map<String, String> result = new TreeMap<String, String>();
		// 获取实体类的所有属性,返回Fields数组
		Field[] fields = obj.getClass().getDeclaredFields();
		for(Field f : fields) {
			String name = f.getName();// 获取属性的名字
			String type = f.getGenericType().toString();
			if("class java.lang.String".equals(type)) {// 如果type是类类型,则前面包含"class ",后面跟类名
				Method me = obj.getClass().getMethod("get" + UpperCaseField(name));
				String tem = (String) me.invoke(obj);
				if(null != tem) {
					result.put(name, tem);
				}
			}
		}
		return result;
	}
	
	public static List<Object> querySolrResult(Object propertyObj, Object compositorObj, Integer pageSize) throws Exception {
		Map<String, String> propertyMap = new TreeMap<String, String>();
		Map<String, String> compositorMap = new TreeMap<String, String>();
		propertyMap = getQueryProperty(propertyObj);
		compositorMap = getQueryProperty(compositorObj);
		SolrDocumentList docList = query(propertyMap, compositorMap, pageSize);
		List<Object> list = new ArrayList<Object>();
		for(Object obj : docList) {
			list.add(obj);
		}
		return list;
	}
	
	private static String UpperCaseField(String name) {
		return name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
	}

	public CommonsHttpSolrServer getServer() {
		return server;
	}

	public void setServer(CommonsHttpSolrServer server) {
		this.server = server;
	}

}


海量数据搜索——搜索引擎 在我们平常的生活工作中,百度、谷歌这些搜索网站已经成为了我们受教解惑的学校,俗话说的好,有问题找度娘。那么百度是如何在海里数据中找到自己需要的数据呢,为什么他搜索的速度如此之快,我们都知道是因为百度的搜索引擎,那么搜索引擎到底是个什么东西呢?可能有的程序员会想到es,但是并不能代表搜索引擎,它只是其中的一种工具,不过这种工具确实好用,效率很高。   本文会向大家讲述搜索引擎的基本知识以及中文分词... 阅读详情

相关推荐

全文检索(solr)实例

分词器和配置已经弄好了,只要按照网页说明把solr_home和solr_data放到D盘根目录下就可以了,solr放到tomcat下面。

学习solr搜索引擎demo

demo 1.首先创建maven工程 然后导入所需的jar包 <!--springboot启动器--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2....

波波的博客 300

非常全面的solrj使用案例

里面有非常详细的说明交你怎么使用solrj客户端来操作solrAPI

Apache Solr搜索引擎开发框架

为什么要学习搜索引擎开发框架 常见的搜索引擎框架: 1.Solr 2.ElasticSearch 搭建ELK环境(ElasticSearch+Logback+Kabana)实现日志系统的搭建 Solr是基于Apache Lucene构建的流行,快速,开源的企业搜索平台。

qq_54899200的博客 1327

php与solr交互扩展库包

php与solr开源数据库的进行数据交互的扩展包,使用时直接导入到文档中即可

solr教程+实例

solr教程+实例

Solr全文检索

什么是solr: solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行, 我们使用它的客户端工具包 solrj 来远程调用solr服务器, 完成对索引库的操作(对索引库的添加修改删除, 查询) solr底层使用lucene编写。 Lucene是一个全文检索引擎工具包,它不是一个完整的全文检索应用 而Solr的目标是打造一款企业级的搜索引擎系统 s...

Rhin0cer0s的博客 545

医用超声图像模拟系统算法:空间分辨率详解

医用超声图像模拟系统中的空间分辨率,是连接物理原理、信号处理算法和最终图像质量的桥梁。通过精确模拟从声场发射、组织相互作用到信号接收和图像重建的全链条过程,并运用先进的波束形成、解卷积和超分辨率算法,我们可以不断逼近并突破物理极限,为开发下一代高分辨率超声成像系统提供强大的算法验证平台和数据集来源。未来的趋势将是更高保真度的物理模拟、更智能的自适应算法与数据驱动方法的深度融合。

alxraves的博客 702

Solr实现全文检索

1.Solr是什么? Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。 Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个...

Mr.Z博客 3690

从仿真到实物:Realsense D435+ROS2焊接机械臂的视觉标定与数据验证指南

本文详细介绍了如何将Realsense D435相机与ROS2焊接机械臂从仿真环境迁移到实物部署的全过程。通过视觉标定、数据验证和焊接场景优化,确保系统在真实环境中精准可靠。重点讲解了硬件配置、驱动优化、数据一致性验证及焊接应用的特殊处理,为工业自动化开发者提供实用指南。

weixin_28701593的博客 407

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 202

基于Lucene的全文搜索服务器Solr

一、Solr的基本概念 1.Solr的基本概念 1.1 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;通过Http Get操作提出查找请求,并得到XML格式的返回结果。 1.2 Solr是apache的开源项目,它使用java语言开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,Solr可配置、可扩展并对查询性能进行了优化,提供了一个

飞奔的嗨少 513

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

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

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。Solr是如何实现全文检索的呢?

刻苦的樊同学 1387

48V电动车电池包拆解:硬核入门BMS硬件设计与故障排查

BMS(电池管理系统)是锂电应用的核心安全与性能保障模块,其本质是融合电化学、模拟电路、嵌入式控制与热管理的交叉系统。理解BMS不能止步于SOC算法或通信协议,而需回归硬件本体——从电压采样精度、MOSFET驱动时序、被动均衡散热设计到NTC热耦合布局,每一处物理实现都直接决定系统可靠性。48V平台因兼具安全性(<60V ELV)、复杂度(13–14串)与产业普及性,成为BMS工程实践的理想标本。本文聚焦真实电池包中的PCB级设计缺陷识别、关键参数现场验证(如±5mV采样误差、5mΩ导通内阻)、UART协议

weixin_29191081的博客 232

置顶必读(1) |《YOLOv8实战:从入门到深度优化》专栏导读,带你一文了解本专栏!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 14万+

elasticsearch说了一些了,这次说说Solr【入门Solr这篇就够了】

在之前的博客中,我提到过ElasticSearch学习,请先看这一篇(win_Elasticsearch) 并在空闲之余写了一篇关于反向索引和手写分词器,具体在搜索引擎——反向索引原理揭秘及手写ik分词器这篇博客中。 但是es可谓是博大精深的,推荐博主铭毅天下,也是我关注的两个博主中的其中一位。对es有很深入的研究和理解。 那么言归正传,本篇就说说Solr! 或许你会想平时感觉听到的都是e...

乔治大哥的博客 1412

S7-1200PLC 2轴直线插补详细算法(完整源代码)

速度轴V90PN总线伺服梯形加减速速度控制(标准报文1应用)_v90伺服加减速时间怎么调整-优快云博客文章浏览阅读288次。

RXXW_Dor的博客 4254

solr笔记

1. 什么是solr solr是一个apache的全文检索引擎系统, 就是个war包, 部署到Tomcat下就可以独立运行, 我们使用它的客户端工具包 solrj来远程调用solr服务器, 完成对索引库的操作(对索引库的添加修改删除, 查询) solr底层使用lucene编写. 2. 作用 对于大数据量搜索或者是查询, 速度非常快, 并且不会随着数据量的增大而减缓查询速度. 主要应用于大型的互联网...

weixin_44683239的博客 1730

[Dify] 【实战笔记】优化 Excel 电话簿类知识库检索效果的实战技巧

摘要:文章分析了Dify知识库在处理Excel结构化数据(如电话簿)时出现的检索异常问题,发现主要原因是默认召回多条记录且缺乏精准匹配机制。提出两个核心解决方案:1)优化知识库召回参数,包括调整TopK值、提高关键词权重等;2)设计精准提示词模板,明确约束模型行为范围。通过对比测试验证了优化效果,并给出进阶建议如数据格式转换、输出格式化等。最后针对知识检索类AI应用提供了场景适配建议。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 364

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

Solr介绍 Solr具有高度的可靠性,可伸缩性和容错能力,可提供分布式索引,复制和负载平衡查询,自动故障转移和恢复,集中式配置等。Solr为许多世界上最大的互联网站点提供搜索和导航功能。 Solr是具有REST类API的独立企业搜索服务器。您可以通过JSON,XML,CSV或HTTP二进制文件将文档放入其中(称为“索引编制”)。您通过HTTP GET查询它,并接收JSON,XML,CSV或二...

程序工厂 599

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

将Solarium与SOLR一起使用进行搜索-设置

Apache’s SOLR is an enterprise-level search platform based on Apache Lucene. It provides a powerful full-text search along with advanced features such as faceted search, result highlighting and geosp...

culi4814的博客 330

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Solr——企业级搜索应用服务器

​ 在Solr中、每一个Core、代表一个索引库、里面包含索引数据及其配置信息。​ Solr中可以拥有多个Core、也就是可以同时管理多个索引库、就像mysql中可以有多个数据库一样。​ 所以SolrCore可以理解成MySQL中的数据库;​ 作用:这个Tokenizer将文本的空格和标点当做分隔符。注意,你的Email地址(含有@符合)可能会被分解开;用点号(就是小数点)连接的部分不会被分解开。对于有连字符的单词,也会被分解开。<analyzer>

还想做MAD 656

solr基础操作

全文检索服务器 1Solr介绍 1.1什么是solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。 Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。 Solr

weixin_56603901的博客 531

solr初学

全文检索服务器 1 Solr介绍 1.1 什么是solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 Solr是apache的顶级开源项目,它是使用java开发 ,基于lucene的全文检索服务器。 Solr比lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对lucene的性能进行了优化。 So

qq_40660127的博客 261

指尖上的电商---(2)Solr全文搜索引擎的准备工作

感谢原博主分享,在此表示感谢!,转自:http://blog.youkuaiyun.com/zx13525079024/article/details/24796751 Solr是一个基于Lucene的全文搜索引擎,提供了更丰富的搜索语言,更灵活的配置,更高的查询效率。一句话,与Lucene相比,有过之而无不及。这一节里, 主要谈论两个知识点:Jdk的安装和Tomcat的安装。 Sol

PR 1526
上一篇: 全文搜索服务器solr之客户端 - solrj二次开发
下一篇: 表格内td的内容自动换行
Y叔输得起
博客等级 码龄16年 15粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值