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 ...
随机推荐
- 新拿到的app跑的时候出现问题
连接器链接失败,是因为对应类build后的中间产物.o文件没有生成,对应架构下,用模拟器跑的,很可能是因为无法编译产出x86,或i386架构的中间产物,所以linker链接转换机器码时候找不到对应的中 ...
- this that 时间戳转日期 小程序 列表 与 加载
var gd = getApp().globalData; var imgUrlApp = gd.imgUrlApp; var localImgPath = gd.localImgPath; var ...
- 使用iconv的包装类CharsetConverter进行编码转换的示例
GitHub地址https://github.com/BuYishi/charset_converter_test charset_converter_test.cpp #include <io ...
- 【c++】map 迭代器删除演示样例
C++ STL中的map是很常见的.通常我们用例如以下方式来遍历,而且删除map中的一些entry: map<int, int> mp; mp.insert(make_pair(1,1)) ...
- (C\C++)inline关键字
背景(C&C++中) inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义如: #define ExpressionName(Va ...
- 做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)
代码: #include <stdio.h> #include <string.h> #include <string> #include <vector&g ...
- javascript flash 弹框
1. [代码]FlashBox // JavaScript Documentfunction FlashBox(src,width,height){var docbody = document ...
- BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数
BZOJ_2186_[Sdoi2008]沙拉公主的困惑_欧拉函数 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行 ...
- 图像分类与KNN
1 图像分类问题 1.1 什么是图像分类 所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像.虽然看起来挺简单的,但这可 ...
- hdoj1007【几何】【未完待续】
题意: 在一个平面上有n(1e5)个点,然后求一个圆来包住这些点,求这个圆的最小半径. 思考: 要使一个圆直接包了这些点,没有任何思路..