发布:2024/1/27 18:00:44作者:管理员 来源:本站 浏览次数:1064
本文主要介绍使用 Java 来操作 Solr,文中所使用到的软件版本:Java 1.8.0_191、Solr 8.9.0。
1、定义 Schema 信息
假设一个描述诗人信息的文档包含如下字段:
字段 描述
id 唯一主键
age 年龄
name 姓名
poems 诗歌
about 简介
success 成就
定义的 schema 信息如下:
复制代码
<field name="about" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="age" type="pint" uninvertible="true" indexed="true" stored="true"/>
<field name="content" type="text_ik" uninvertible="true" indexed="true" stored="true" multiValued="true"/>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="name" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="poems" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
<field name="success" type="text_ik" uninvertible="true" indexed="true" stored="true"/>
复制代码
2、Java 操作 Solr
2.1、引入依赖
复制代码
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>8.9.0</version>
</dependency>
复制代码
2.2、编写 demo
2.2.1、增加/更新文档
复制代码
@Test
public void update() throws IOException, SolrServerException {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("age", 30);
document.addField("name", "李白2");
document.addField("poems", "望庐山瀑布");
document.addField("about", "字太白");
document.addField("success", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
SolrInputDocument document2 = new SolrInputDocument();
document2.addField("id", "123457");
document2.addField("age", 31);
document2.addField("name", "杜甫");
document2.addField("poems", "望岳");
document2.addField("about", "字子美");
document2.addField("success", "唐代伟大的现实主义文学作家,唐诗思想艺术的集大成者");
solrClient.add(coreName, document);
solrClient.add(coreName, document2);
solrClient.commit(coreName, true,true);
}
复制代码
还可以通过实体类来增加/更新文档:
复制代码
@Test
public void update2() throws IOException, SolrServerException {
PoetInfo info = new PoetInfo("123456", 40, "李白", "望庐山瀑布", "字太白", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
solrClient.addBean(coreName, info);
solrClient.commit(coreName, true,true);
}
复制代码
2.2.2、查询文档
复制代码
/**
* 通过 MapSolrParams 查询
*/
@Test
public void query() throws IOException, SolrServerException {
Map<String, String> map = new HashMap<>();
//查询条件
map.put("q", "*:*");
//要显示的内容
map.put("fl", "id,age,name,poems");
//排序方式
map.put("sort", "id asc");
MapSolrParams solrParams = new MapSolrParams(map);
QueryResponse queryResponse = solrClient.query(coreName, solrParams);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 通过 solrQuery 查询
*/
@Test
public void query2() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(coreName, solrQuery);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 查询返回实例类对象
*/
@Test
public void query3() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addField("about");
solrQuery.addField("success");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(coreName, solrQuery);
List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);
logger.info("查询到{}个文档!", list.size());
for (PoetInfo info : list) {
logger.info(info.toString());
}
}
复制代码
2.2.3、删除文档
复制代码
/**
* 根据id删除文档
*/
@Test
public void delete() throws IOException, SolrServerException {
solrClient.deleteById(coreName, "123456");
solrClient.commit(coreName, true,true);
}
/**
* 根据查询删除文档
*/
@Test
public void delete2() throws IOException, SolrServerException {
solrClient.deleteByQuery(coreName, "name:杜甫");
solrClient.commit(coreName, true,true);
}
复制代码
2.2.4、完整代码
复制代码
package com.abc.demo.general.solr;
import org.apache.solr.client.solrj.beans.Field;
public class PoetInfo {
@Field
private String id;
@Field
private Integer age;
@Field
private String name;
@Field
private String poems;
@Field
private String about;
@Field
private String success;
public PoetInfo() {
}
public PoetInfo(String id, Integer age, String name, String poems, String about, String success) {
this.id = id;
this.age = age;
this.name = name;
this.poems = poems;
this.about = about;
this.success = success;
}
@Override
public String toString() {
return "Info{" +
"id='" + id + '\'' +
", age=" + age +
", name='" + name + '\'' +
", poems='" + poems + '\'' +
", about='" + about + '\'' +
", success='" + success + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAbout() {
return about;
}
public void setAbout(String about) {
this.about = about;
}
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
}
复制代码
复制代码
package com.abc.demo.general.solr;
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.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.MapSolrParams;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SolrCase {
private static Logger logger = LoggerFactory.getLogger(SolrCase.class);
private HttpSolrClient solrClient;
private String coreName = "new_core";
@Before
public void before() {
solrClient = new HttpSolrClient.Builder("http://10.49.196.10:8983/solr")
.withConnectionTimeout(10000)
.withSocketTimeout(60000)
.build();
}
@After
public void after() throws IOException {
solrClient.close();
}
@Test
public void update() throws IOException, SolrServerException {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("age", 30);
document.addField("name", "李白2");
document.addField("poems", "望庐山瀑布");
document.addField("about", "字太白");
document.addField("success", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
SolrInputDocument document2 = new SolrInputDocument();
document2.addField("id", "123457");
document2.addField("age", 31);
document2.addField("name", "杜甫");
document2.addField("poems", "望岳");
document2.addField("about", "字子美");
document2.addField("success", "唐代伟大的现实主义文学作家,唐诗思想艺术的集大成者");
solrClient.add(coreName, document);
solrClient.add(coreName, document2);
solrClient.commit(coreName, true,true);
}
@Test
public void update2() throws IOException, SolrServerException {
PoetInfo info = new PoetInfo("123456", 40, "李白", "望庐山瀑布", "字太白", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
solrClient.addBean(coreName, info);
solrClient.commit(coreName, true,true);
}
/**
* 通过 MapSolrParams 查询
*/
@Test
public void query() throws IOException, SolrServerException {
Map<String, String> map = new HashMap<>();
//查询条件
map.put("q", "*:*");
//要显示的内容
map.put("fl", "id,age,name,poems");
//排序方式
map.put("sort", "id asc");
MapSolrParams solrParams = new MapSolrParams(map);
QueryResponse queryResponse = solrClient.query(coreName, solrParams);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 通过 solrQuery 查询
*/
@Test
public void query2() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(coreName, solrQuery);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 查询返回实例类对象
*/
@Test
public void query3() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addField("about");
solrQuery.addField("success");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(coreName, solrQuery);
List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);
logger.info("查询到{}个文档!", list.size());
for (PoetInfo info : list) {
logger.info(info.toString());
}
}
/**
* 根据id删除文档
*/
@Test
public void delete() throws IOException, SolrServerException {
solrClient.deleteById(coreName, "123456");
solrClient.commit(coreName, true,true);
}
/**
* 根据查询删除文档
*/
@Test
public void delete2() throws IOException, SolrServerException {
solrClient.deleteByQuery(coreName, "name:杜甫");
solrClient.commit(coreName, true,true);
}
}
复制代码
3、Java 操作 SolrCloud
Java 操作 SolrCloud 与 Java 操作 Solr 很类似,主要区别有:
1、连接使用的类不同,连接 Solr 使用的是 HttpSolrClient,连接 SolrColud 使用的是 CloudHttp2SolrClient。
2、API 针对的操作对象不同,Solr 针对的是 core,SolrCloud 针对的是 collection。
3.1、引入依赖
复制代码
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>8.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>8.9.0</version>
</dependency>
复制代码
3.2、编写 demo
3.2.1、增加/更新文档
复制代码
@Test
public void update() throws IOException, SolrServerException {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("age", 30);
document.addField("name", "李白2");
document.addField("poems", "望庐山瀑布");
document.addField("about", "字太白");
document.addField("success", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
SolrInputDocument document2 = new SolrInputDocument();
document2.addField("id", "123457");
document2.addField("age", 31);
document2.addField("name", "杜甫");
document2.addField("poems", "望岳");
document2.addField("about", "字子美");
document2.addField("success", "唐代伟大的现实主义文学作家,唐诗思想艺术的集大成者");
solrClient.add(collection, document);
solrClient.add(collection, document2);
solrClient.commit(collection, true,true);
}
复制代码
还可以通过实体类来增加/更新文档:
复制代码
@Test
public void update2() throws IOException, SolrServerException {
PoetInfo info = new PoetInfo("123456", 40, "李白", "望庐山瀑布", "字太白", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
solrClient.addBean(collection, info);
solrClient.commit(collection, true,true);
}
复制代码
3.2.2、查询文档
复制代码
/**
* 通过 MapSolrParams 查询
*/
@Test
public void query() throws IOException, SolrServerException {
Map<String, String> map = new HashMap<>();
//查询条件
map.put("q", "*:*");
//要显示的内容
map.put("fl", "id,age,name,poems");
//排序方式
map.put("sort", "id asc");
MapSolrParams solrParams = new MapSolrParams(map);
QueryResponse queryResponse = solrClient.query(collection, solrParams);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 通过 solrQuery 查询
*/
@Test
public void query2() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(collection, solrQuery);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 查询返回实例类对象
*/
@Test
public void query3() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addField("about");
solrQuery.addField("success");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(collection, solrQuery);
List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);
logger.info("查询到{}个文档!", list.size());
for (PoetInfo info : list) {
logger.info(info.toString());
}
}
复制代码
3.2.3、删除文档
复制代码
/**
* 根据id删除文档
*/
@Test
public void delete() throws IOException, SolrServerException {
solrClient.deleteById(collection, "123457");
solrClient.commit(collection, true,true);
}
/**
* 根据查询删除文档
*/
@Test
public void delete2() throws IOException, SolrServerException {
solrClient.deleteByQuery(collection, "name:杜甫");
solrClient.commit(collection, true,true);
}
复制代码
3.2.4、完整代码
复制代码
package com.abc.demo.general.solr;
import org.apache.solr.client.solrj.beans.Field;
public class PoetInfo {
@Field
private String id;
@Field
private Integer age;
@Field
private String name;
@Field
private String poems;
@Field
private String about;
@Field
private String success;
public PoetInfo() {
}
public PoetInfo(String id, Integer age, String name, String poems, String about, String success) {
this.id = id;
this.age = age;
this.name = name;
this.poems = poems;
this.about = about;
this.success = success;
}
@Override
public String toString() {
return "Info{" +
"id='" + id + '\'' +
", age=" + age +
", name='" + name + '\'' +
", poems='" + poems + '\'' +
", about='" + about + '\'' +
", success='" + success + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAbout() {
return about;
}
public void setAbout(String about) {
this.about = about;
}
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
}
复制代码
复制代码
package com.abc.demo.general.solr;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
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 org.apache.solr.common.params.MapSolrParams;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CloudSolrCase {
private static Logger logger = LoggerFactory.getLogger(CloudSolrCase.class);
private CloudHttp2SolrClient solrClient;
private String collection = "collection-1";
@Before
public void before() {
List<String> urls = new ArrayList<>();
urls.add("http://10.49.196.10:8983/solr");
urls.add("http://10.49.196.11:8983/solr");
urls.add("http://10.49.196.12:8983/solr");
solrClient = new CloudHttp2SolrClient.Builder(urls).build();
}
@After
public void after() throws IOException {
solrClient.close();
}
@Test
public void update() throws IOException, SolrServerException {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "123456");
document.addField("age", 30);
document.addField("name", "李白2");
document.addField("poems", "望庐山瀑布");
document.addField("about", "字太白");
document.addField("success", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
SolrInputDocument document2 = new SolrInputDocument();
document2.addField("id", "123457");
document2.addField("age", 31);
document2.addField("name", "杜甫");
document2.addField("poems", "望岳");
document2.addField("about", "字子美");
document2.addField("success", "唐代伟大的现实主义文学作家,唐诗思想艺术的集大成者");
solrClient.add(collection, document);
solrClient.add(collection, document2);
solrClient.commit(collection, true,true);
}
@Test
public void update2() throws IOException, SolrServerException {
PoetInfo info = new PoetInfo("123456", 40, "李白", "望庐山瀑布", "字太白", "创造了古代浪漫主义文学高峰、歌行体和七绝达到后人难及的高度");
solrClient.addBean(collection, info);
solrClient.commit(collection, true,true);
}
/**
* 通过 MapSolrParams 查询
*/
@Test
public void query() throws IOException, SolrServerException {
Map<String, String> map = new HashMap<>();
//查询条件
map.put("q", "*:*");
//要显示的内容
map.put("fl", "id,age,name,poems");
//排序方式
map.put("sort", "id asc");
MapSolrParams solrParams = new MapSolrParams(map);
QueryResponse queryResponse = solrClient.query(collection, solrParams);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 通过 solrQuery 查询
*/
@Test
public void query2() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(collection, solrQuery);
SolrDocumentList documents = queryResponse.getResults();
logger.info("查询到{}个文档!", documents.getNumFound());
for (SolrDocument document : documents) {
String id = (String)document.getFieldValue("id");
Integer age = (Integer)document.getFieldValue("age");
String name = (String)document.getFieldValue("name");
String poems = (String)document.getFieldValue("poems");
logger.info("id={},age={},name={},poems={}", id, age, name, poems);
}
}
/**
* 查询返回实例类对象
*/
@Test
public void query3() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery("*:*");
solrQuery.addField("id");
solrQuery.addField("age");
solrQuery.addField("name");
solrQuery.addField("poems");
solrQuery.addField("about");
solrQuery.addField("success");
solrQuery.addSort("id", SolrQuery.ORDER.asc);
//设置返回的行数
solrQuery.setRows(10);
QueryResponse queryResponse = solrClient.query(collection, solrQuery);
List<PoetInfo> list = queryResponse.getBeans(PoetInfo.class);
logger.info("查询到{}个文档!", list.size());
for (PoetInfo info : list) {
logger.info(info.toString());
}
}
/**
* 根据id删除文档
*/
@Test
public void delete() throws IOException, SolrServerException {
solrClient.deleteById(collection, "123457");
solrClient.commit(collection, true,true);
}
/**
* 根据查询删除文档
*/
@Test
public void delete2() throws IOException, SolrServerException {
solrClient.deleteByQuery(collection, "name:杜甫");
solrClient.commit(collection, true,true);
}
}
复制代码
© Copyright 2014 - 2025 柏港建站平台 ejk5.com. 渝ICP备16000791号-4