全文检索工具solr:第一章:理论知识

简介: 全文检索工具solr:第一章:理论知识

什么是Solr

大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能

这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,这就确保你能从几乎任何编程语言来使用solr。


Solr是一个开源搜索平台,用于构建搜索应用程序。 它建立在Lucene(全文搜索引擎)之上。 Solr是企业级的,快速的和高度可扩展的。 使用Solr构建的应用程序非常复杂,可提供高性能。


为了在CNET网络的公司网站上添加搜索功能,Yonik Seely于2004年创建了Solr。并在2006年1月,它成为Apache软件基金会下的一个开源项目。并于2016年发布最新版本Solr 6.0,支持并行SQL查询的执行。


Solr可以和Hadoop一起使用。由于Hadoop处理大量数据,Solr帮助我们从这么大的源中找到所需的信息。不仅限于搜索,Solr也可以用于存储目的。像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。


总之,Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。

什么是中文分析器IK Analyzer

IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版开始,

IKAnalyzer 已经推出了 4 个大版本。最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立亍 Lucene 项目,同时提供了对 Lucene 的默认优化实现。在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。

什么是Spring Data Solr

虽然支持任何编程语言的能力具有很大的市场价值,你可能感兴趣的问题是:我如何Solr的应用集成到Spring中可以,Spring Data Solr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ(官方API)的封装。

搭建工程

  1. 创建maven工程,pom.xml中引入依赖
   <dependencies>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
  </dependencies>

(2)在src/main/resources下创建  applicationContext-solr.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/data/solr
   http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- solr服务器地址 -->
<solr:solr-server id="solrServer" url="http://127.0.0.1:8080/solr" />
<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>

@Field 注解

属性使用@Field(域名)注解标识 。   如果属性与配置文件定义的域名称不一致,需要在注解中指定域名称。

public class SkuInfo implements Serializable{
  String id;
    String spuId;
    @Field("sku_price")
    BigDecimal price;
    @Field("sku_name")
    String skuName;
    BigDecimal weight;
    @Field("sku_desc")
    String skuDesc;
    String catalog3Id;
    @Field("sku_default_img")
    String skuDefaultImg;
.......
}

增加(修改)

对于修改:如果id存在就认为是修改,若不存在,就认为是新增

创建测试类TestTemplate.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class TestTemplate {
  @Autowired
  private SolrTemplate solrTemplate;
  @Test
  public void testAdd(){
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId("1");
        skuInfo.setSkuName("华为");
        skuInfo.setPrice(new BigDecimal(3000.01));
        skuInfo.setCatalog3Id("2");
        skuInfo.setSkuDefaultImg("www.baidu,com");
        skuInfo.setSkuDesc("非常好");
        skuInfo.setSpuId("3");    
  solrTemplate.saveBean(skuInfo);
        solrTemplate.commit();
  }
}

按主键查询

@Test
public void testFindOne(){
   SkuInfo sku =  template.getById("1",SkuInfo.class);
        System.out.printf(sku.getSkuName());
}

按主键删除

@Test
public void testDelete(){
solrTemplate.deleteById("1");
solrTemplate.commit();
}

分页查询

首先循环插入100条测试数据

@Test
public void testAddList(){
List<TbItem> list=new ArrayList();
for(int i=0;i<100;i++){
TbItem item=new TbItem();
item.setId(i+1L);
item.setBrand("华为");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("华为2号专卖店");
item.setTitle("华为Mate"+i);
item.setPrice(new BigDecimal(2000+i));
list.add(item);
}
solrTemplate.saveBeans(list);
solrTemplate.commit();
}

编写分页查询测试代码:

@Test
public void testPageQuery(){
Query query=new SimpleQuery("*:*");
query.setOffset(20);//开始索引(默认0)
query.setRows(20);//每页记录数(默认10)
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
System.out.println("总记录数:"+page.getTotalElements());
List<TbItem> list = page.getContent();
showList(list);
}
//显示记录数据
private void showList(List<TbItem> list){
for(TbItem item:list){
System.out.println(item.getTitle() +item.getPrice());
}
}

条件查询

Criteria 用于对条件的封装:

@Test
public void testPageQueryMutil(){
Query query=new SimpleQuery("*:*");
Criteria criteria=new Criteria("item_title").contains("2");
criteria=criteria.and("item_title").contains("5");
query.addCriteria(criteria);
//query.setOffset(20);//开始索引(默认0)
//query.setRows(20);//每页记录数(默认10)
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
System.out.println("总记录数:"+page.getTotalElements());
List<TbItem> list = page.getContent();
showList(list);
}

删除全部数据

@Test
public void testDeleteAll(){
Query query=new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}

项目:solrTest

相关文章
IntelliJ IDEA热部署插件JRebel免费激活图文教程
首先说下热部署是什么意思吧,简单了说就是在我们对代码进行更改之后,不需要重启项目,重新编译一下就可以直接运行最新的代码的部署方式。既然是部署方式,项目启动部署的时候当然就会和正常情况下不一样啦~
IntelliJ IDEA热部署插件JRebel免费激活图文教程
|
11月前
|
缓存 Java 网络安全
Solr7.4.0报错org.apache.solr.common.SolrException
在使用 Solr 7.4.0 时,`org.apache.solr.common.SolrException` 错误可能由多种原因引起,包括配置文件错误、核心未加载、权限问题、Java 环境问题、依赖库冲突和网络配置问题。通过检查配置文件、确保正确的权限、验证Java环境、解决依赖库冲突和检查网络配置,可以有效解决这些问题。结合日志文件、管理控制台和调试模式,可以快速定位和解决错误,确保 Solr 系统的稳定运行。
509 1
|
搜索推荐 Java API
如何在Java应用中实现全文搜索功能
如何在Java应用中实现全文搜索功能
|
Java 编译器
成功解决:java file outside of source root
解决Java文件不在源代码根目录内的问题,可以通过在IDEA中将包含.java文件的目录设置为Sources Root来修复。
成功解决:java file outside of source root
|
Java Maven
Java系列之:GroupId和ArtifactId的作用
这篇文章解释了在Maven项目中`GroupId`和`ArtifactId`的含义和作用,其中`GroupId`通常由域和自定义域名组成,用于区分组织或公司,而`ArtifactId`是项目或模块的名称,两者结合用于唯一标识项目包,确保不会与他人的项目包重复。
|
文字识别 Java 计算机视觉
【神技解锁】Spring Boot + Tess4J:一图胜千言,瞬间变文字,颠覆你的视觉体验!
【8月更文挑战第29天】本文详细介绍了如何在 Spring Boot 项目中集成 Tess4J,实现高效本地与远程图片的光学字符识别(OCR)处理。通过具体步骤展示了如何添加依赖、配置 OCR 引擎、创建图片处理服务及控制器,并提供了测试方法。这不仅适用于文本识别场景,还可扩展至其他图像处理任务,为项目增添实用功能。
1520 1
|
域名解析 监控 安全
接口开放太麻烦?试试阿里云API网关吧
我在[多方合作时,系统间的交互是怎么做的?](https://www.cnblogs.com/wlovet/p/17466812.html)这篇文章中写过一些多方合作时接口的调用规则和例子,然而,接口开放所涉及的安全、权限、监控、流量控制等问题,可不是简简单单就可以解决的,这一般需要专业的开放平台来支撑。但为了开放几个接口就要做一个开放平台,实在是不合算。为此阿里云为了解决这类需求推出了一款强大的工具——API网关。本文将介绍阿里云API网关的特点和优势,以及如何使用API网关来简化接口开放的过程。
608 0
接口开放太麻烦?试试阿里云API网关吧
|
算法 安全 Java
Hutool-crypto 加密、解密详解!
Hutool-crypto 加密、解密详解!
1100 0
|
数据库
分布式锁实现问题之数据库中的分布式锁有哪些缺点
分布式锁实现问题之数据库中的分布式锁有哪些缺点
|
消息中间件 监控 网络安全
在RocketMQ中,生产者提交数据导致连接不上问题
【6月更文挑战第19天】在RocketMQ中,生产者提交数据导致连接不上问题
476 1