单机solrJ不需要占用太多的服务器和资源,本机使用solr-6.3.0,也不需要配置tomcat.

一、新建一个java工程需要依赖的jar包如下:

solr-solrj-6.3.0.jar;  commons-lang-2.5.jar  ; log4j-1.2.17.jar; slf4j-api-1.7.7.jar; slf4j-log4j12-1.7.6.jar;httpclient-4.4.1.jar; httpcore-4.4.1.jar; httpmime-4.4.1.jar

(解析json常用的包:commons-logging-1.1.1.jar;commons-beanutils-1.7.jar;commons-collections.jar; noggit-0.5.jar; ezmorph.jar; json-lib-2.2.2-jdk15.jar;)

二、文档操作(增加,删除,查询)的代码如下:

1.首先创建一个对象,对象只有一些属性值,没有成员方法。

 package test;

 public class LawTest {
// String fields[]={"guid","lawName","itemIndex","itemTitle","itemContent","categoryTitle","categoryIndex"};
private String guid;
private String lawName;
private int itemIndex;
private String itemTitle;
private String itemContent;
private String categoryTitle;
private int categoryIndex;
public LawTest(){
this.guid="";
this.lawName="";
this.itemIndex=0;
this.itemTitle="";
this.itemContent="";
this.categoryTitle="";
this.categoryIndex=0;
}
public LawTest(String guid,String lawName,int itemIndex,String itemTitle,String itemContent,String categoryTitle,int categoryIndex){
this.guid=guid;
this.lawName=lawName;
this.itemIndex=itemIndex;
this.itemTitle=itemTitle;
this.itemContent=itemContent;
this.categoryTitle=categoryTitle;
this.categoryIndex=categoryIndex;
}
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
public String getLawName() {
return lawName;
}
public void setLawName(String lawName) {
this.lawName = lawName;
}
public int getItemIndex() {
return itemIndex;
}
public void setItemIndex(int itemIndex) {
this.itemIndex = itemIndex;
}
public String getItemTitle() {
return itemTitle;
}
public void setItemTitle(String itemTitle) {
this.itemTitle = itemTitle;
}
public String getItemContent() {
return itemContent;
}
public void setItemContent(String itemContent) {
this.itemContent = itemContent;
}
public String getCategoryTitle() {
return categoryTitle;
}
public void setCategoryTitle(String categoryTitle) {
this.categoryTitle = categoryTitle;
}
public int getCategoryIndex() {
return categoryIndex;
}
public void setCategoryIndex(int categoryIndex) {
this.categoryIndex = categoryIndex;
} }

2.有了对象后,开始构建我们的客户端代码:首先初始化连接

     private static String serverUrl="http://localhost:8983/solr/collectionTest";
private static String fields[]={"guid","lawName","itemIndex","itemTitle","itemContent","categoryTitle","categoryIndex"};
private static SolrClient solrclient = null;
private static SolrQuery query=new SolrQuery("*:*");
/**
* 初始化连接
*/
@SuppressWarnings("deprecation")
public static void initiate(){
solrclient = new HttpSolrClient(serverUrl);
}

3.  然后需要将已有的入库json文本转化为对象,再根据对象添加到solr中

 /**
* 输入文档存放地址,读取为字符串
* 将字符串解析为json并转换为对象
* @param DirectoryPath
* @return
*/
public static List<LawTest> readTxtFile(String DirectoryPath){
List<LawTest> list = new ArrayList<LawTest>();
try {
String encoding="GB2312";//UTF-8
String guid=null;
String lawName=null;
int itemIndex=0;
String itemTitle=null;
String itemContent=null;
String categoryTitle=null;
int categoryIndex=0;
File file=new File(DirectoryPath);
File[] tempList = file.listFiles();
System.out.println("该目录下对象个数:"+tempList.length);
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile() && tempList[i].exists()) {
//保存每一个文本为字符串
StringBuilder stringAll=new StringBuilder();
System.out.println("文 件:"+i+":"+tempList[i]);
InputStreamReader read = new InputStreamReader(
new FileInputStream(tempList[i]),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
System.out.println(lineTxt);
stringAll.append(lineTxt);
}
String text=stringAll.toString();
JSONArray arry = JSONArray.fromObject(text);
System.out.println("json字符串内容如下");
System.out.println(arry);
//List<Map<String, String>> rsList = new ArrayList<Map<String, String>>();
for (int j = 0; j < arry.size(); j++)
{
JSONObject jsonObject = arry.getJSONObject(j);
//Map<String, String> map = new HashMap<String, String>();
for (Iterator<?> iter = jsonObject.keys(); iter.hasNext();)
{
String key = (String) iter.next();
String value = jsonObject.get(key).toString();
// map.put(key, value);
if("guid".equals(key)){ guid=value; }
else if("lawName".equals(key)){ lawName=value;}
else if("itemIndex".equals(key)){ itemIndex=Integer.valueOf(value);}
else if("itemTitle".equals(key)){ itemTitle=value;}
else if("itemContent".equals(key)){ itemContent=value;}
else if("categoryIndex".equals(key)){ categoryIndex=Integer.valueOf(value);}
else if("categoryTitle".equals(key)){ categoryTitle=value;} }
LawTest lawlistbean=new LawTest( guid, lawName, itemIndex, itemTitle, itemContent, categoryTitle, categoryIndex);
list.add(lawlistbean);
//rsList.add(map);
}
}
}
}
catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return list; }

4.添加文档:

  /**
* 添加文档
* @param DocList
*/
public static void addDocs(List<LawTest> DocList) {
try {
for (int i = 0; i<DocList.size();i++){
SolrInputDocument doc1=new SolrInputDocument();
doc1.setField("guid", DocList.get(i).getGuid());
doc1.setField("lawName", DocList.get(i).getLawName());
doc1.setField("itemIndex", DocList.get(i).getItemIndex());
doc1.setField("itemTitle", DocList.get(i).getItemTitle());
doc1.setField("itemContent", DocList.get(i).getItemContent());
doc1.setField("categoryIndex", DocList.get(i).getCategoryIndex());
doc1.setField("categoryTitle", DocList.get(i).getItemTitle());
solrclient.add(doc1);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
solrclient.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}

5.删除文档;

 /**
* 根据索引删除文档
* @param query
*/
public void delDoc(String query){
try {
solrclient.deleteByQuery(query);
solrclient.commit();
} catch (Exception e) {
e.printStackTrace();
} }

6.查询文档;

    /**
* 查询文档
* @param query
*/
public static List<Map<String,Object>> queryDoc(SolrQuery query, String[] fields){
if(query==null || fields==null){
return null;
}
else{
QueryResponse resp3 = null;
query.setStart(0);
query.setRows(10);
query.setFields(fields);
try {
resp3=solrclient.query(query);
} catch (SolrServerException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} SolrDocumentList solrList = resp3.getResults();
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
for (SolrDocument doc : solrList) {
Map<String, Object> resultMap=new HashMap<String, Object>();
for (String field : fields){
resultMap.put(field,doc.get(field));
}
result.add(resultMap);
}
return result;
}
}
//查询文档入口
public static List<Map<String,Object>> retrieveContent(Map<String, Object> args){
//关键词
String keywords = (String) args.remove("keyword");
if (!(keywords == null || "".equals(keywords))) {
query.setQuery(keywords);
}
//其他查询过滤条件
for (Entry<String, Object> entry : args.entrySet()) {
query.addFilterQuery(entry.getKey() + ":" + entry.getValue());
}
return queryDoc(query,fields);
}

7.获取文档数量:

 public static long getCount(){
long numFound = 0;
SolrQuery q = query.getCopy();
q.setStart(0);
q.setRows(0);
try {
//没必要排序
q.remove("sort");
if ((query.getBool("group", false))) {
q.setParam("group", false);
q.setParam("group.ngroups", false);
String field = query.get("group.field");
q.set("json.facet", "{distinctCount:'unique(" + field + ")'}");
}
QueryResponse results = solrclient.query(q,METHOD.POST);
if ((query.getBool("group", false))) {
Object facets = results.getResponse().get("facets");
if(facets != null && facets instanceof SimpleOrderedMap){
Object distinctCount = ((SimpleOrderedMap)facets).get("distinctCount");
if(distinctCount != null ){
numFound = (Long)distinctCount;
}
}
} else {
numFound = results.getResults().getNumFound();
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return numFound;
}

8.测试主函数:

 public static void main(String [] args) throws SolrServerException, IOException{
String path="D:\\文件\\solr入库测试文件";
Map<String, Object> map=new HashMap<String, Object>();
//初始化
initiate();
//添加文档测试
//addDocs(readTxtFile(path));
//查询
map.put("keyword", "标题");
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
result=retrieveContent(map);
if(result==null || result.size()==0){
System.out.println("data is null");
}
else{
System.out.println("-----输出查询结果如下:-----\n");
result.forEach( mp->{
for(String key: mp.keySet()){
System.out.println(key+":"+mp.get(key).toString());
} });
}
System.out.println("query count:"+getCount());
System.out.println("query over!"); }

SOLRJ单机-添加文档,删除,查询操作的更多相关文章

  1. Elasticsearch(5):添加文档

      1 ES数据读写流程¶ ES中,每个索引都将被划分为若干分片,每个分片可以有多个副本.这些副本共同组成复制组,复制组中的分片在添加或删除文档时必须保持同步,否则,从一个副本中读取的数据将与从另一个 ...

  2. solr学习之添加文档

    一.开篇语 其实Solr就是一个你可以通过他来查询文档的东西,他整个都是基于Document的,那么这些Document从何而来列?  当然是我们给他,而这些来源就包括了:数据库文件,XML,Json ...

  3. Xapian的内存索引-添加文档

    本文主要记录Xapian的内存索引在添加文档过程中,做了哪些事情. 内容主要为函数执行过程中的流水线. demo代码: Xapian::WritableDatabase db = Xapian::In ...

  4. Xamarin.Android 入门实例(4)之实现对 SQLLite 进行添加/修改/删除/查询操作

    1.Main.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  5. Mongodb 级联删除查询操作

    ObjRelationPojo表一条记录 public class YpObjRelationPojo implements Serializable { @Id private String id; ...

  6. MongoDB(8)- 文档删除操作

    删除方法 db.collection.deleteOne() 删除单条文档 db.collection.deleteMany() 删除多条文档 db.collection.remove() 删除单条或 ...

  7. Django 1.10 中文文档------3.2.2 查询操作making queries

    3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ...

  8. 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作

    centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...

  9. MongoDB入门---文档查询操作之条件查询&and查询&or查询

    经过前几天的学习之路,今天终于到了重头戏了.那就是文档查询操作.话不多说哈,直接看下语法: db.collection.find(query, projection) query :可选,使用查询操作 ...

随机推荐

  1. C++使用模板、函数指针、接口和lambda表达式这四种方法做回调函数的区别比较

    在C++中,两个类之间存在一种关系,某个类需要另外一个类去完成某一个功能,完成了之后需要告知该类结果,这种最普通最常见的需求,往往使用回调函数来解决. 如题,我总结下来有这么四种方式可以完成这项功能, ...

  2. DeepLearningFlappyBird-深度学习玩游戏-1-环境搭建

    -------------------------------------------------------------------------------------- https://githu ...

  3. hihoCoder 1586 Minimum 【线段树】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2 ...

  4. eureka-注册中心使用密码验证

    spring cloud 1.1 版本之后可以使用 配置文件: bootstrap.yml server.port: 9000 spring.application.name: registry eu ...

  5. spring cloud-服务注册

    正常的服务模块,注册到注册中心,让别的服务发现,调用服务 创建“服务提供方” 下面我们创建提供服务的客户端,并向服务注册中心注册自己. 假设我们有一个提供计算功能的微服务模块,我们实现一个RESTfu ...

  6. xunit inlinedata classdata memberdata

    https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdat ...

  7. SpringBoot发送简单文本邮件

    1.pom.xml添加 spring-boot-starter-mail 依赖 <dependency> <groupId>org.springframework.boot&l ...

  8. Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索

    Lucene 的四大索引查询  清单1:使用布尔操作符 Java代码      //Test boolean operator blic void testOperator(String indexD ...

  9. servlet的<url-pattern>

    ① 完全匹配 <url-pattern>/test/list.do</url-pattern> ② 路径匹配 <url-pattern>/*</url-pat ...

  10. 如何 Xcode 开发工具里安装一个空的项目末模板

    很多朋友因为Xcode升级取消了空工程模板而发愁  今天给大家推荐一个简单方便的方法,导入空工程模板 对于 xcode7 来说可以使用下面的方法添加空模板.建议在升级的时候,不要下载beta版,最好下 ...