Solr和Solrj的使用

article/2025/10/13 22:54:02

Solr(4.10.3)&Solrj

部署环境

1.拷贝solr

solr-4.10.3\example\solr 目录到【如E:/solr/】,重命名solr为solrhome 【E:/solr/solrhome】

  • solrhome:solr里面有几个文件

    • ``collection1`:有一个默认名称为collection1的SolrCore索引库
      • conf:SolrCore运行配置信息
        • conf/solrconfig.xml:配置SolrCore实例的相关信息
     	...(配置见 #配置solrconfig.xml)
    
    - <font color=red>	`conf/schema.xml`:主要用于配置域的类型(FieldType)和配置域(Field)**根据数据库决定**</font>
    
     	...(配置见 #配置schema.xml)
    
    • data:SolrCore存放日志和索引文件的目录
    • core.properties:SolrCore的信息,比如:名称

2.拷贝solr.war并解压

  1. 从solr解压包下的solr-4.10.3\example**\webapps目录中拷贝solr.war**,到tomcat的webapps目录并解压【…webapps/solr/】
  2. 把solr解压包下solr-4.10.3\example**\lib\ext目录下的所有jar包拷贝到Tomcat部署的solr的WEB-INF/lib**文件夹
  3. 把solr解压包下solr-4.10.3\example**\resources\log4j.properties文件,复制到Tomcat的webapps\solr\WEB-INF\classes**目录下
  • tomcat/webapps/solr : #1 . 解压完成

    • WEB-INF
      • IK分词器jar包和配置文件:后面分词会用到
      • lib

    #2 . example\lib\ext的包拷贝到这里

    在这里插入图片描述

    • classes:如果没有这个文件夹就新建一个

    #3.\resources\log4j.properties拷贝到这里

    在这里插入图片描述

    • web.xml:配置SolrHome的路径(大概在41行左右)
     <env-entry><env-entry-name>solr/home</env-entry-name><!--在这里配置--><env-entry-value>E:/solr/solrhome</env-entry-value><env-entry-type>java.lang.String</env-entry-type></env-entry>
    

配置schema.xml

schema.xml配置文件在 solr/collection1/conf/

主要域

版本号

<!-- 版本号(必须) -->
<field name="_version_" type="long" indexed="true" stored="true"/>

配置域

<!-- 配置域*name:域的名称 --- 对应数据库字段的名字*type:域的类型(决定是否分词) --- 对应数据库字段对应的类型*indexed:是否索引*stored:是否存储required:是否必须(如果为true添加索引的时候,文档对象中必须要包含该域)mulitValued:是否多值(可以允许一个域保存多个值,比如保存多个QQ好友)
-->
<field name="id" type="string" indexed="true" stored="true" 
required="true" multiValued="false"/> 
<field name="title1" type="string" indexed="true" stored="true"/>
<field name="title2" type="text" indexed="true" stored="true"/>

动态域

<!-- 动态域,*表示匹配任意字符串,如匹配product_i -->
<dynamicField name="*_i"  type="int" indexed="true"  stored="true"/>

在这里插入图片描述

唯一约束域

<!-- 唯一约束域,相当于关系数据库中的主键 -->
<uniqueKey>id</uniqueKey>

复制域

<!-- 复制域copyField允许将多个域的值复制给一个域,方便执行搜索。目标域的定义必须要包含一个属性:multiValued="true"source:源域的名称dest:目标域的名称
-->
<!--keywords = title1 + title2-->
<field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="title1" dest="keywords"/>
<copyField source="title2" dest="keywords"/>

配置域的类型

<!-- 配置域的类型*name:域的类型名称*class:域的类型,solr中的类型analyzer:指定分词器,index是索引流程;query是检索流程tokenizer:具体使用的分词器filter:具体使用的过滤器
-->
<fieldType name="string" class="solr.StrField"/>
<fieldType name="boolean" class="solr.BoolField"/>
<fieldType name="int" class="solr.TrieIntField"/>
<fieldType name="float" class="solr.TrieFloatField"/>
<fieldType name="long" class="solr.TrieLongField"/>
<fieldType name="double" class="solr.TrieDoubleField"/>
<fieldType name="date" class="solr.TrieDateField"/>
<fieldType name="text_ik" class="solr.TextField"><!-- 配置IK分词器 --><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

拷贝IK分词器jar包和配置文件

拷贝到solr/WEB-INF/classes目录下

在这里插入图片描述

<!-- 配置使用IK分词器的域 -->
<field name="content_ik" type="text_ik" indexed="false" stored="true"multiValued="false"/>
<!-- 配置使用IK分词器的域类型 -->
<fieldType name="text_ik" class="solr.TextField" ><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

配置solrconfig.xml

solrconfig.xml配置文件在/collection1/conf/中

1.配置lib标签,加载jar包

<!-- 加载一些扩展的jar(大概在75行左右)${solr.install.dir}相当于solrhome目录 E:/solr/solrhome
-->
<lib dir="${solr.install.dir}/lib/" regex=".*\.jar" />

2.配置域名城

<!-- 配置搜索处理器(大概在827行) -->
<requestHandler name="/select" class="solr.SearchHandler"><lst name="defaults"><str name="echoParams">explicit</str><int name="rows">10</int><!--默认域名称--><str name="df">keyword</str></lst>
...

3.配置数据请求处理器

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"><lst name="defaults"><!-- 配置文件 --><str name="config">data-config.xml</str></lst>
</requestHandler>

4.创建 data-config.xml

创建在/collection1/conf/中,(和solrconfig.xml同级目录)

配置JDBC的数据源和域与数据库表的关系

<?xml version="1.0" encoding="UTF-8"?>  
<dataConfig>  <!--配置连接数据库信息--><dataSource type="JdbcDataSource"   driver="com.mysql.jdbc.Driver"   url="jdbc:mysql://127.0.0.1:3306/solr"   user="root"   password="root"/>   <document>  <!--配置sql语句中的字段,与solr索引库的域的对应关系--><entity name="user" query="SELECT id,title1,title2 FROM tableName"><field column="id" name="id"/> <field column="title1" name="title1"/> <field column="title2" name="title2"/> </entity>   </document> 
</dataConfig>

Solrj使用

1.导入依赖

<dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>4.10.3</version>
</dependency>
<!-- commons-logging -->
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.3</version>
</dependency>

2.创建实体类

public class User {@Field("id")	//和数据库字段名相同可以省略不写private String id;@Fieldprivate String title1;@Field("title2")	private String title2;/** setter and getter method */
}

3.运行测试

public class SolrTest {/** 定义SolrServer,用来操作Solr */private SolrServer solrServer = newHttpSolrServer("http://127.0.0.1:8080/solr/collection1");...
}

添加或修改索引

/** 添加或修改索引 */
@Test
public void saveOrUpdate() throws Exception{User user = new User();user.setId("1");user.setTitle1("osc");user.setTitle1("zzy");solrServer.addBean(user);// 提交事务solrServer.commit();
}

删除索引

/** 根据id删除索引 */
@Test
public void deleteById() throws Exception{solrServer.deleteById("1");// 提交事务solrServer.commit();
}
/** 根据条件删除 */
@Test
public void deleteByQuery() throws Exception{// 删除条件: name:osc//solrServer.deleteByQuery("title1:osc");// 删除全部solrServer.deleteByQuery("*:*");// 提交事务solrServer.commit();
}

查询索引

/** 查询全部索引 */
@Test
public void queryAll() throws Exception{// 创建SolrQuery封装查询条件SolrQuery sq = new SolrQuery("*:*");// 设置分页开始记录数sq.setStart(0);// 设置每页显示记录数sq.setRows(10);// 执行搜索,得到查询响应对象QueryResponse response = solrServer.query(sq);System.out.println("搜索到得总数量:" +response.getResults().getNumFound());// 获取搜索结果,并转化成实体集合List<User> users = response.getBeans(User.class);
}

Spring Data Solr

1.导入依赖包

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-solr</artifactId><version>1.5.6.RELEASE</version>
</dependency>

2.新建实体类

配置schema.xml,solrconfig.xml步骤省略

public class User {@Field("id")private int id;@Field("name")private String name;@Field("age")	private double age;/** setter and getter method */public void setAge(BigDecimal age) {this.age = age.doubleValue();}
}

3.新建applicationContext-solr.xml

新建在项目的/resources里

<!--头文件-->
<?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:solr="http://www.springframework.org/schema/data/solr"xsi:schemaLocation="http://www.springframework.org/schema/data/solrhttp://www.springframework.org/schema/data/solr/spring-solr.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 配置SolrServer --><solr:solr-server id="solrServer"url="http://192.168.12.131:8088/solr/collection1"/><!-- 配置SolrTemplate,它可以对Solr索引库做CRUD操作 --><bean id="solrTemplate"class="org.springframework.data.solr.core.SolrTemplate"><constructor-arg name="solrServer" ref="solrServer"/></bean>
</beans>

4.运行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class SolrTest {@Autowiredprivate SolrTemplate solrTemplate;...
}

添加或修改

@Test
public void saveOrUpdate(){User user = new User();user.setId(10086);user.setName("osc");user.setAge(new BigDecimal(20));UpdateResponse updateResponse = solrTemplate.saveBean(user);if (updateResponse.getStatus() == 0) {solrTemplate.commit();}else {solrTemplate.rollback();}
}

删除

@Test
public void deleteById(){UpdateResponse updateResponse = solrTemplate.deleteById("10086");if(updateResponse.getStatus() == 0) {solrTemplate.commit();}else {solrTemplate.rollback();}
}

删除全部

@Test
public void deleteAll(){Query query = new SimpleQuery("*:*");UpdateResponse updateResponse = solrTemplate.delete(query);if (updateResponse.getStatus() == 0) {solrTemplate.commit();}else {solrTemplate.rollback();}
}

批量添加

@Test
public void addList(){List<User> list = new ArrayList<>();for(long i = 1; i <= 100; i++){User user = new User();user.setId(10000+i);user.setName("osc");user.setAge(new BigDecimal(20));list.add(user);}UpdateResponse updateResponse = solrTemplate.saveBeans(list);if (updateResponse.getStatus() == 0) {solrTemplate.commit();}else {solrTemplate.rollback();;}
}

根据主键id查询

@Test
public void findOne(){User user = solrTemplate.getById(10010, User.class);System.out.println(user.getName());
}

带条件分页查询

@Test
public void findByPage() {/** 创建查询对象 */Query query = new SimpleQuery("*:*");/** 创建条件对象(标题包含2) */Criteria criteria = new Criteria("title").contains("2");/** 添加条件 */query.addCriteria(criteria);/** 设置分页开始记录数(第一页) 默认0 */query.setOffset(0);/** 设置每页显示记录数,默认10 */query.setRows(20);ScoredPage<User> page = solrTemplate.queryForPage(query,User.class);System.out.println("总记录数:" + page.getTotalElements());List<User> users = page.getContent();
}

http://chatgpt.dhexx.cn/article/S1Qm9jmK.shtml

相关文章

SolrJ的查询

1.solr是一个全文检索引擎系统,通过部署到tomcat下就可以独立运行,通过http协议对外提供全文检索服务, 就是索引和文档的正删改查服务 2. solr直接操作索引库和文档库, 我们的业务系统中可以使用solrJ(solr的客户端,就是一堆jar包)来调用solr服务端, 让solr服务端操作文档库和…

使用solrJ操作solr常用方法

既然学的是java那么肯定需要用java代码来进行对solr的操作&#xff0c;如果知道在solr后台管理界面进行增删改查等操作&#xff0c;那么用solrJ操作solr会更好理解。 solrJ介绍 solrJ是一个用来访问solr的java客户端&#xff0c;提供了索引和搜索的方法&#xff08;将一些常用…

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

全文检索solr(五)Solrj的使用

什么是solrj solrj是访问Solr服务的java客户端&#xff0c;提供索引和搜索的请求方法&#xff0c;如下图&#xff1a; Solrj和图形界面操作的区别就类似于数据库中使用jdbc和mysql客户端的区别一样。 需求 使用solrj调用solr服务实现对索引库的增删改查操作。 环境准备 So…

Solr-Solrj简单使用

一、SolrJ简介 SolrJ是操作Solr的Java客户端&#xff0c;它提供了增加、修改、删除、查询Solr索引的Java接口。通过solrJ提供的API接口来操作solr服务&#xff0c;SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。 二、依赖配置 <dependency><groupId>…

solrj

文章目录 1.什么是solrj?2.搭建工程2.1.导入相关jar包 3.对索引库做增删改查3.1.添加&#xff08;以实体类的方式&#xff09;添加方法 3.3.修改&#xff08;update&#xff09;3.4.删除以ID删除批量删除&#xff08;以ID&#xff09;以条件删除&#xff08;query&#xff09;…

Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)

一、SolrJ介绍 1. SolrJ是什么&#xff1f; Solr提供的用于JAVA应用中访问solr服务API的客户端jar。在我们的应用中引入solrj&#xff1a; <dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>7…

solr学习之solrj

solrJ是访问Solr服务的JAVA客户端&#xff0c;提供索引和搜索的请求方法&#xff0c;SolrJ通常嵌入在业务系统中&#xff0c;通过solrJ的API接口操作Solr服务。 一 .maven的环境jar包配置 <!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj --><d…

Pytorch实现逻辑斯蒂回归模型 代码实操

初学者学习Pytorch系列 第一篇 Pytorch初学简单的线性模型代码实操 第二篇 Pytorch实现逻辑斯蒂回归模型 代码实操 文章目录 初学者学习Pytorch系列前言一、先上代码二、测试结果1. 数据结果2.画图结果 总结 前言 上一篇的数据中&#xff0c;是这样子的例子 x_data代表的学习的…

回归分析(三)二项逻辑斯蒂回归模型

回归分析&#xff08;三&#xff09;二项逻辑斯蒂回归 学了一段时间突然又遇到逻辑斯蒂回归&#xff0c;结果发现已经忘完了&#xff0c;所以今天重新梳理一下。 &#xff08;1&#xff09;逻辑斯蒂分布 先看一下逻辑斯蒂分布函数 F ( x ) F(x) F(x)&#xff0c;其概率密度函数…

回归分析:逻辑斯蒂回归模型,可视化分类决策边界

文章目录 逻辑斯蒂回归模型逻辑斯蒂回归模型python案例 逻辑斯蒂回归模型 前面的例子都是在用线性模型解决回归任务&#xff0c;那么线性模型能否完成分类任务呢&#xff1f;相较于回归任务&#xff0c;分类任务的预测值是离散的&#xff0c;比如二分类问题&#xff0c;可以用…

机器学习:逻辑斯蒂回归

目录 逻辑回归模型介绍逻辑斯蒂分布二项逻辑斯谛回归模型目标函数 逻辑回归模型介绍 原理&#xff1a; 逻辑斯谛回归&#xff08;logistic regression&#xff09;是经典的分类方法&#xff0c;它属于对数线性模型&#xff0c;原理是根据现有的数据对分类边界线建立回归公式&a…

《PyTorch深度学习实践》06 逻辑斯蒂回归 代码

视频&#xff1a;06.逻辑斯蒂回归_哔哩哔哩_bilibili 参考文章&#xff1a;pytorch 深度学习实践 第6讲 逻辑斯蒂回归_会游泳的小雁的博客-CSDN博客 网络模型的基本框架 1步骤&#xff1a; 1.Prepare dataset 2.Design model using Class &#xff08;inherit from nn.Modul…

逻辑斯蒂回归 matlab实现

说明 我将试图从感知机的基础上说明逻辑回归的一般性原理和学习及预测方法&#xff0c;其中缺少一些必要的证明&#xff0c;包括了一个二分类问题的实例。其中关于感知机的实验在 机器学习 专栏中有介绍。 从感知机到逻辑斯蒂回归 感知机模型&#xff1a; 应用范围&#xf…

Lecture6 逻辑斯蒂回归(Logistic Regression)

目录 1 常用数据集 1.1 MNIST数据集 1.2 CIFAR-10数据集 2 课堂内容 2.1 回归任务和分类任务的区别 2.2 为什么使用逻辑斯蒂回归 2.3 什么是逻辑斯蒂回归 2.4 Sigmoid函数和饱和函数的概念 2.5 逻辑斯蒂回归模型 2.6 逻辑斯蒂回归损失函数 2.6.1 二分类损失函数 2.…

机器学习之逻辑斯蒂回归

目录 一、分类与回归 二、逻辑回归不是回归 三、生成式逻辑回归 四、判别式逻辑回归 五、逻辑回归为什么不用均方误差做损失函数 六、判别模型与生成模型的比较 七、写在最后 一、分类与回归 回归与分类是机器学习的基本问题。回归是预测连续值&#xff0c;分类是预测…

逻辑斯蒂回归算法

目录 逻辑斯蒂分布 二元逻辑斯蒂回归模型 二元逻辑斯蒂回归的损失函数及优化方法 二元逻辑斯蒂回归的正则化 多元逻辑斯蒂回归 逻辑斯蒂回归小结 LR的优点 LR的缺点 LR将连续特征离散化的原因 逻辑回归和线性回归的区别和联系 LR和SVM的关系 scikit-learn 逻辑回归…

逻辑斯蒂回归以及它的梯度下降法

文章目录 前言逻辑斯蒂分布 模型二项逻辑斯蒂回归模型多项逻辑斯蒂回归模型 策略算法如何求对数似然函数的最大值梯度下降法算法思想推导公式 注意 前言 预测任务分为&#xff1a; 回归问题&#xff1a;输入、输出变量为连续变量。分类问题&#xff1a;输出变量为有限个离散变…

逻辑斯蒂回归分类算法

逻辑斯蒂回归分类算法 首先来看一个线性回归来进行分类的问题&#xff1a; 怎样判断肿瘤是否恶性&#xff1f; 很明显线性回归用于分类问题无法处理边界点的位置。 同时&#xff0c;线性回归健壮性不够&#xff0c;一旦有噪声&#xff0c;立刻“投降” 使用逻辑斯蒂回归 ——…

逻辑斯蒂回归(二分类算法)理论+Python代码实现

逻辑斯蒂回归&#xff08;二分类算法&#xff09;理论Python代码实现 文章目录 逻辑斯蒂回归&#xff08;二分类算法&#xff09;理论Python代码实现一、理论基础&#xff08;一&#xff09; 基于 Logistic 回归和 Sigmoid 函数的分类&#xff08;二&#xff09; 模型训练与代价…