单机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. bash shell最基本的语法

    1 shell语句的基本构成 shell每个基本的构成元素之间都相隔一个空格. 比如[ -e file ],[.-e.file.]这四个基本元素之间都相隔了一个空格. 同样的道理[ ! -e file ...

  2. group by where having 联合使用

    having子句与where有相似之处但也有区别,都是设定条件的语句.在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优 ...

  3. 两篇C++和VC++字符串的文章

    有空挨个摘录写点心得 http://www.cnblogs.com/maowang1991/p/3572304.html http://www.cnblogs.com/maowang1991/p/35 ...

  4. CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow

    原文链接:http://blog.chinaunix.net/uid-14607221-id-2794642.html 1. PreCreateWindow: Called by the framew ...

  5. (linux)tasklet

      tasklet Tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联 例子: Void my_tasklet_func(unsigned long) DECLARE_TA ...

  6. HDU - 1269 迷宫城堡(有向图的强连通分量)

    d.看一个图是不是强连通图 s.求出强连通分量,看看有没有一个强连通分量包含所有点. c.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> ...

  7. Python(1)(安装与基本使用)

    1.Python的下载和安装我就不废话了,百度上都有. 我安装的是Python 3.4.3 64bit 安装完之后,打开Cmd,输入Python 显示以上相同,按照百度的意思就是安装成功. 2.配置环 ...

  8. Android gif 录屏

    /********************************************************************************** * Android gif 录屏 ...

  9. 读取每行的数据,加入到list中

    有txt文件中,每行都有一个字符串或者数据,将每行的数据转换到一个list中 例如: 1 2 3 6 实现: f = open("test1.txt",'r') list1 = [ ...

  10. CS231n 2016 通关 第二章-KNN 作业分析

    KNN作业要求: 1.掌握KNN算法原理 2.实现具体K值的KNN算法 3.实现对K值的交叉验证 1.KNN原理见上一小节 2.实现KNN 过程分两步: 1.计算测试集与训练集的距离 2.通过比较la ...