solrJ的使用--覆盖创建索引,查询,删除索引【转自http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html】
package com.xzhe.common.search; import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map; import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument; import com.xzhe.goods.bo.Goods;
import com.xzhe.goods.dao.impl.GoodsDAO; public class SolrSearch {
private static String tomcat_solr = "http://localhost:8983/solr";
private static CommonsHttpSolrServer solr = null;
private static GoodsDAO goodsDAO = GoodsDAO.getInstance();
private static List<Goods> goodList = new ArrayList<Goods>(); // 初始化solr服务
public static void initiate() {
try {
solr = new CommonsHttpSolrServer(tomcat_solr);
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
} catch (Exception e) {
System.out.println("请检查tomcat服务器或端口是否开启!");
e.printStackTrace();
}
} // 检测good是否有字段为空
public static Boolean CheckGood(Goods good) {
if (null == good.getTitle() || good.getTitle().length() == 0) {
return false;
} else if (null == good.getGoodsId()) {
return false;
} else if (null == good.getStartTime()) {
return false;
} else if (null == good.getDiscount()) {
return false;
} else if (null == good.getCurPrice()) {
return false;
} else if (null == good.getSiteId()) {
return false;
} else if (null == good.getBuyNum()) {
return false;
} else {
return true;
}
} // 将数据库中的时间转换为solr可接受的格式
public static String Convertime(String time) {
time = time.replace(" ", "T");
time = time + "00Z";
return time;
} // 添加list到索引,flag为false,在原有基础上添加,为false,重新添加、原有索引不会被删除
public static void addGoods(List<Goods> list, Boolean flag) {
if (flag) {
try {
solr.deleteByQuery("*:*");
} catch (Exception e) {
e.printStackTrace();
}
} Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); for (int i = 0; i < list.size(); i++) {
Goods good = list.get(i);
if (CheckGood(good)) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("goodid", good.getGoodsId());
doc.addField("title", good.getTitle());
doc.addField("siteid", good.getSiteId());
doc.addField("buynum", good.getBuyNum());
doc.addField("starttime", Convertime(good.getStartTime()
.toString()));
doc.addField("discount", good.getDiscount());
doc.addField("curprice", good.getCurPrice());
docs.add(doc);
}
} try {
solr.add(docs);
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
} // 转换good到beans
public static GoodsBeans ConvertGoodstoBeans(Goods good) {
if (!CheckGood(good)) {
return null;
}
GoodsBeans beans = new GoodsBeans(good.getGoodsId().toString(),
good.getTitle(), good.getSiteId().toString(), good.getBuyNum(),
good.getStartTime(), good.getDiscount(), good.getCurPrice());
return beans;
} // 添加beans到索引
public static void addGoodsBeans(List<GoodsBeans> beansList) {
try {
solr.addBeans(beansList);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
} // 删除所有索引
public static void DeleteAllIndex() {
try {
solr.deleteByQuery("*:*");
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
} // 根据ID删除索引
public static void DeleteIndex(List<String> ids) {
try {
solr.deleteById(ids);
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
} // 进行搜索,field、key为查询(值或范围均可),start为起始查询位置,row为返回结果个数,sortfield为排序字段,flag中true升序、false降序,hightlight选择是否高亮返回,高亮字段为title
public static QueryResponse Search(String[] field, String[] key, int start,
int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
if (null == field || null == key || field.length != key.length) {
return null;
}
if (null == sortfield || null == flag
|| sortfield.length != flag.length) {
return null;
} SolrQuery query = null;
try {
if (field[0].equals("title")) {
// query = new SolrQuery("*" + key + "*");
query = new SolrQuery(field[0] + ":" + key[0]);
} else {
query = new SolrQuery(field[0] + ":" + key[0]);
}
for (int i = 0; i < field.length; i++) {
if (field[i].equals("title")) {
// query = new SolrQuery("*" + key + "*");
query.addFilterQuery(field[i] + ":" + key[i]);
} else {
query.addFilterQuery(field[i] + ":" + key[i]);
}
}
query.setStart(start);
query.setRows(count);
for (int i = 0; i < sortfield.length; i++) {
if (flag[i]) {
query.addSortField(sortfield[i], SolrQuery.ORDER.asc);
} else {
query.addSortField(sortfield[i], SolrQuery.ORDER.desc);
}
}
if (null != hightlight) {
query.setHighlight(true); // 开启高亮组件
query.addHighlightField("title");// 高亮字段
query.setHighlightSimplePre("<font color=\"red\">");// 标记
query.setHighlightSimplePost("</font>");
query.setHighlightSnippets(1);
query.setHighlightFragsize(1000);
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(query.toString()); QueryResponse rsp = null;
try {
rsp = solr.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return rsp;
} // 自动补全
public static String[] autoComplete(String prefix, int min) {
String words[] = null;
StringBuffer sb = new StringBuffer("");
SolrQuery query = new SolrQuery("*.*");
QueryResponse rsp = new QueryResponse();
try {
query.setFacet(true);
query.setQuery("*:*");
query.setFacetPrefix(prefix);
query.addFacetField("title");
rsp = solr.query(query);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
} if (null != rsp) {
FacetField ff = rsp.getFacetField("title");
List<Count> countList = ff.getValues();
if (null == countList) {
return null;
}
for (int i = 0; i < countList.size(); i++) {
String tmp[] = countList.get(i).toString().split(" ");
if (tmp[0].length() < 2) {
continue;
}
sb.append(tmp[0] + " ");
min--;
if (min == 0) {
break;
}
}
words = sb.toString().split(" ");
} else {
return null;
}
return words;
} public static void main(String[] args) {
initiate(); // 建立索引
// goodList = goodsDAO.findAll();
// System.out.println("所有商品载入完成!");
// DeleteAllIndex();
// System.out.println("原有索引已清除!");
// System.out.println("添加索引开始!");
// long starttime = System.currentTimeMillis();
// addGoods(goodList, true);
// long endtime = System.currentTimeMillis();
// System.out.println("共耗时" + (endtime - starttime) + "ms!");
// System.out.println("添加索引完成!"); // 进行查询
SolrDocumentList solrList = null;
QueryResponse rsp = null; // rsp = Search("title", "*变形金* 蓝精灵", 0, 10, "buynum", false, true);
// String field[] = { "title", "buynum", "discount", "starttime" };
// String key[] = { "变形金刚 哈利波特", "[90 TO 100]", "[2.0 TO 3.0]",
// "[2011-07-18T00:00:00.000Z TO 2011-07-19T00:00:00.000Z]" };
String field[] = {"title"};
String key[] = {"牛奶"};
String sortfield[] = { "buynum" };
Boolean flag[] = { false };
long starttime = System.currentTimeMillis();
rsp = Search(field, key, 0, 10, sortfield, flag, true);
long endtime = System.currentTimeMillis();
System.out.println("共耗时" + (endtime - starttime) + "ms!"); if (null != rsp) {
solrList = rsp.getResults();
for (int i = 0; i < solrList.size(); i++) {
System.out.println(solrList.get(i).toString());
}
// 高亮显示部分
System.out.println("搜索结果共" + solrList.size() + "条!");
System.out.println("");
Map<String, Map<String, List<String>>> hightlight = rsp
.getHighlighting();
List<GoodsBeans> tmpLists = rsp.getBeans(GoodsBeans.class);
for (int i = 0; i < tmpLists.size(); i++) {
String hlString = hightlight.get(tmpLists.get(i).getGoodId())
.get("title").toString();
if (null != hlString) {
// System.out.println(hlString);
}
}
} // 自动补全
// String words[] = autoComplete("哈利", 10);
// if (null != words) {
// System.out.println(words.length);
// for (int i = 0; i < words.length; i++) {
// System.out.println(words[i]);
// }
// }
} }
solrJ的使用--覆盖创建索引,查询,删除索引【转自http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html】的更多相关文章
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题
SQL优化 MySQL版 - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...
- mysql 创建索引和删除索引
索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.删除索引可以利用ALTER TABLE或DROP INDEX语句来实现. ...
- mysql索引 ->创建索引、修改索引、删除索引的命令语句
查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...
- mysql——创建索引、修改索引、删除索引的命令语句
查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...
- INDEX--创建索引和删除索引时的SCH_M锁
最近有一个困惑,生产服务器上有一表索引建得乱七八糟,经过整理后需要新建几个索引,再删除几个索引,建立索引时使用联机(ONLINE=ON)创建,查看下服务器负载(磁盘和CPU压力均比较低的情况)后就选择 ...
- mysql索引学习----2----创建索引、修改索引、删除索引的命令语句
查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...
- Oracle如何创建索引、删除索引、查询索引
1.创建单一索引 create index 索引名称 on 表名(列名); 2.创建复合索引 create index 索引名称 on 表名(列名1,列名2); 3.删除索引 drop index 索 ...
- SQL创建索引和删除索引
使用CREATE 语句创建索引 CREATE INDEX index_name ON table_name(column_name,column_name) include(score) 普通索引 C ...
随机推荐
- redis的图形界面管理工具
大部分人都知道redis是一款用在缓存服务器上的软件,它与memcache类似,都可以存储海量的数据,用在大访问量的web网站.聊天记录存放等方面,但是又与memcache不同: 1.缓存数据可以持久 ...
- dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法
dedecms5.7(织梦CMS5.7)二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法 dedecms升级到5.7SP1后,开启二级域名,你会发现,在二级域名下的文章,上传的图片地址都是: ...
- ExtJS常用代码集合
ExtJS常用代码集合,包括弹出提示框,登陆框,树状结构等等.1. [代码]弹出提示框 <html> <head> <title>Ge ...
- cassandra复制到一个新机器编译失败的问题
在A机器上ant编译后,复制到B机器,在B机器上编译会出错. 原因是载入一些文件时出错,因为路径还是A机器上的路径. 经过与git上的源代码对比,发现多了一个build文件夹,这可能是ant生成的目录 ...
- 调节音量的各个方法——AudioManager的使用
AudioManager类位于android.Media包中,该类提供访问控制音量和铃声模式的操作. //获取AudioManager实例对象 AudioManager audioManage = ( ...
- Getting Started with the Intel Media SDK
By Gael Hofemeier on March 19, 2015 Follow Gael on Twitter: @GaelHof Media SDK Developer’s Guide Med ...
- jquery实现无限滚动瀑布流实现原理
现在类似于pinterest这类的表现效果很火,其实我比较中意的是他的布局效果,而不是那种瀑布流. 虽然我不是特别喜欢这种瀑布流的表现样式,但是还是写了几篇关于无限滚动瀑布流效果的文章,Infinit ...
- web自动化测试的自身特点
1.web页面是出现的元素可能具有不确定性 2.不同操作系统上不同web浏览器之间的兼容性 3.web应用的高并发性和容错性 4.移动设备上web客户端兼容性,旋转下和各种触摸特性
- 【USACO】 Balanced Photo
[题目链接] 点击打开链接 [算法] 树状数组 [代码] #include<bits/stdc++.h> using namespace std; int i,N,ans,l1,l2; ] ...
- k8s-调度器、预选策略及优选函数-二十
一.简介 master上运行着三个最核心的组件,apiserver.scheduler.controller manager.此外,master还依赖于ectd存储节点,最好ectd是有冗余能力的集群 ...