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】的更多相关文章

  1. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  2. SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...

  3. mysql 创建索引和删除索引

    索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.删除索引可以利用ALTER TABLE或DROP INDEX语句来实现. ...

  4. mysql索引 ->创建索引、修改索引、删除索引的命令语句

    查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...

  5. mysql——创建索引、修改索引、删除索引的命令语句

    查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...

  6. INDEX--创建索引和删除索引时的SCH_M锁

    最近有一个困惑,生产服务器上有一表索引建得乱七八糟,经过整理后需要新建几个索引,再删除几个索引,建立索引时使用联机(ONLINE=ON)创建,查看下服务器负载(磁盘和CPU压力均比较低的情况)后就选择 ...

  7. mysql索引学习----2----创建索引、修改索引、删除索引的命令语句

    查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...

  8. Oracle如何创建索引、删除索引、查询索引

    1.创建单一索引 create index 索引名称 on 表名(列名); 2.创建复合索引 create index 索引名称 on 表名(列名1,列名2); 3.删除索引 drop index 索 ...

  9. SQL创建索引和删除索引

    使用CREATE 语句创建索引 CREATE INDEX index_name ON table_name(column_name,column_name) include(score) 普通索引 C ...

随机推荐

  1. php基础篇:echo 与 print 的区别

    在实际使用中, print 和 echo 两者的功能几乎是完全一样.可以这么说,凡是有一个可以使用的地方,另一个也可以使用.但是,两者之间也还是一个非常重要的区别:在 echo 函数中,可以同时输出多 ...

  2. React引入,运行

    1.引入 <script src="https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> ...

  3. [Selenium] 配置 Internet Explorer Driver 的注意事项

    1)请确保 IEDriverServer 的可执行文件在系统环境变量PATH 中 2)在IE7 和以上版本的 Internet Explorer 上,必须确保保护模式的正确配置.设置方式为 Tools ...

  4. Objective-C基础知识

    内联函数 “内联函数”是一个很老的概念,在其他语言譬如C++语言中也出现了.所谓“内联函数”指的是“有函数的结构,但不具备函数的性质,类似于宏替换功能的代码块”. 在实际应用中,常常把规模较小.逻辑较 ...

  5. SQLite学习手册(开篇)

    一.简介: SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB.MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征 ...

  6. JAVA interrupte中断线程的真正用途

    Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...

  7. Collection View Programming Guide for iOS---(七)---Custom Layouts: A Worked Example

    Custom Layouts: A Worked Example Creating a custom collection view layout is simple with straightfor ...

  8. CodeForces 718A Efim and Strange Grade (贪心)

    题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次. 析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还 ...

  9. sql常识性误解

    今天在公司一个项目,遇到一个问题,最后解决下来竟然发现自己对sql竟然存在一个常识性的误解 表数据 需求如下 查找 name中的数据被参数 'adsb' 包含的的列 个人原先的误区一直在于一个认识, ...

  10. AssetDatabase文档翻译

    AssetDatabase是一个能获取工程资源的API,它提供一些方法比如:查找.加载.创建.删除和修改.Unity需要了解工程文件夹里的所有改变,假如想要获取或修改资源文件,就使用 AssetDat ...