1. package com.xzhe.common.search;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.apache.solr.client.solrj.SolrQuery;
  9. import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
  10. import org.apache.solr.client.solrj.response.FacetField;
  11. import org.apache.solr.client.solrj.response.FacetField.Count;
  12. import org.apache.solr.client.solrj.response.QueryResponse;
  13. import org.apache.solr.common.SolrDocumentList;
  14. import org.apache.solr.common.SolrInputDocument;
  15.  
  16. import com.xzhe.goods.bo.Goods;
  17. import com.xzhe.goods.dao.impl.GoodsDAO;
  18.  
  19. public class SolrSearch {
  20. private static String tomcat_solr = "http://localhost:8983/solr";
  21. private static CommonsHttpSolrServer solr = null;
  22. private static GoodsDAO goodsDAO = GoodsDAO.getInstance();
  23. private static List<Goods> goodList = new ArrayList<Goods>();
  24.  
  25. // 初始化solr服务
  26. public static void initiate() {
  27. try {
  28. solr = new CommonsHttpSolrServer(tomcat_solr);
  29. solr.setConnectionTimeout(100);
  30. solr.setDefaultMaxConnectionsPerHost(100);
  31. solr.setMaxTotalConnections(100);
  32. } catch (Exception e) {
  33. System.out.println("请检查tomcat服务器或端口是否开启!");
  34. e.printStackTrace();
  35. }
  36. }
  37.  
  38. // 检测good是否有字段为空
  39. public static Boolean CheckGood(Goods good) {
  40. if (null == good.getTitle() || good.getTitle().length() == 0) {
  41. return false;
  42. } else if (null == good.getGoodsId()) {
  43. return false;
  44. } else if (null == good.getStartTime()) {
  45. return false;
  46. } else if (null == good.getDiscount()) {
  47. return false;
  48. } else if (null == good.getCurPrice()) {
  49. return false;
  50. } else if (null == good.getSiteId()) {
  51. return false;
  52. } else if (null == good.getBuyNum()) {
  53. return false;
  54. } else {
  55. return true;
  56. }
  57. }
  58.  
  59. // 将数据库中的时间转换为solr可接受的格式
  60. public static String Convertime(String time) {
  61. time = time.replace(" ", "T");
  62. time = time + "00Z";
  63. return time;
  64. }
  65.  
  66. // 添加list到索引,flag为false,在原有基础上添加,为false,重新添加、原有索引不会被删除
  67. public static void addGoods(List<Goods> list, Boolean flag) {
  68. if (flag) {
  69. try {
  70. solr.deleteByQuery("*:*");
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. }
  74. }
  75.  
  76. Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
  77.  
  78. for (int i = 0; i < list.size(); i++) {
  79. Goods good = list.get(i);
  80. if (CheckGood(good)) {
  81. SolrInputDocument doc = new SolrInputDocument();
  82. doc.addField("goodid", good.getGoodsId());
  83. doc.addField("title", good.getTitle());
  84. doc.addField("siteid", good.getSiteId());
  85. doc.addField("buynum", good.getBuyNum());
  86. doc.addField("starttime", Convertime(good.getStartTime()
  87. .toString()));
  88. doc.addField("discount", good.getDiscount());
  89. doc.addField("curprice", good.getCurPrice());
  90. docs.add(doc);
  91. }
  92. }
  93.  
  94. try {
  95. solr.add(docs);
  96. solr.optimize();
  97. solr.commit();
  98. } catch (Exception e) {
  99. e.printStackTrace();
  100. }
  101. }
  102.  
  103. // 转换good到beans
  104. public static GoodsBeans ConvertGoodstoBeans(Goods good) {
  105. if (!CheckGood(good)) {
  106. return null;
  107. }
  108. GoodsBeans beans = new GoodsBeans(good.getGoodsId().toString(),
  109. good.getTitle(), good.getSiteId().toString(), good.getBuyNum(),
  110. good.getStartTime(), good.getDiscount(), good.getCurPrice());
  111. return beans;
  112. }
  113.  
  114. // 添加beans到索引
  115. public static void addGoodsBeans(List<GoodsBeans> beansList) {
  116. try {
  117. solr.addBeans(beansList);
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. } finally {
  121. try {
  122. solr.optimize();
  123. solr.commit();
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. }
  127. }
  128. }
  129.  
  130. // 删除所有索引
  131. public static void DeleteAllIndex() {
  132. try {
  133. solr.deleteByQuery("*:*");
  134. solr.commit();
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. }
  138. }
  139.  
  140. // 根据ID删除索引
  141. public static void DeleteIndex(List<String> ids) {
  142. try {
  143. solr.deleteById(ids);
  144. solr.commit();
  145. } catch (Exception e) {
  146. e.printStackTrace();
  147. }
  148. }
  149.  
  150. // 进行搜索,field、key为查询(值或范围均可),start为起始查询位置,row为返回结果个数,sortfield为排序字段,flag中true升序、false降序,hightlight选择是否高亮返回,高亮字段为title
  151. public static QueryResponse Search(String[] field, String[] key, int start,
  152. int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
  153. if (null == field || null == key || field.length != key.length) {
  154. return null;
  155. }
  156. if (null == sortfield || null == flag
  157. || sortfield.length != flag.length) {
  158. return null;
  159. }
  160.  
  161. SolrQuery query = null;
  162. try {
  163. if (field[0].equals("title")) {
  164. // query = new SolrQuery("*" + key + "*");
  165. query = new SolrQuery(field[0] + ":" + key[0]);
  166. } else {
  167. query = new SolrQuery(field[0] + ":" + key[0]);
  168. }
  169. for (int i = 0; i < field.length; i++) {
  170. if (field[i].equals("title")) {
  171. // query = new SolrQuery("*" + key + "*");
  172. query.addFilterQuery(field[i] + ":" + key[i]);
  173. } else {
  174. query.addFilterQuery(field[i] + ":" + key[i]);
  175. }
  176. }
  177. query.setStart(start);
  178. query.setRows(count);
  179. for (int i = 0; i < sortfield.length; i++) {
  180. if (flag[i]) {
  181. query.addSortField(sortfield[i], SolrQuery.ORDER.asc);
  182. } else {
  183. query.addSortField(sortfield[i], SolrQuery.ORDER.desc);
  184. }
  185. }
  186. if (null != hightlight) {
  187. query.setHighlight(true); // 开启高亮组件
  188. query.addHighlightField("title");// 高亮字段
  189. query.setHighlightSimplePre("<font color=\"red\">");// 标记
  190. query.setHighlightSimplePost("</font>");
  191. query.setHighlightSnippets(1);
  192. query.setHighlightFragsize(1000);
  193. }
  194. } catch (Exception e) {
  195. e.printStackTrace();
  196. }
  197. System.out.println(query.toString());
  198.  
  199. QueryResponse rsp = null;
  200. try {
  201. rsp = solr.query(query);
  202. } catch (Exception e) {
  203. e.printStackTrace();
  204. return null;
  205. }
  206. return rsp;
  207. }
  208.  
  209. // 自动补全
  210. public static String[] autoComplete(String prefix, int min) {
  211. String words[] = null;
  212. StringBuffer sb = new StringBuffer("");
  213. SolrQuery query = new SolrQuery("*.*");
  214. QueryResponse rsp = new QueryResponse();
  215. try {
  216. query.setFacet(true);
  217. query.setQuery("*:*");
  218. query.setFacetPrefix(prefix);
  219. query.addFacetField("title");
  220. rsp = solr.query(query);
  221. } catch (Exception e) {
  222. // TODO: handle exception
  223. e.printStackTrace();
  224. return null;
  225. }
  226.  
  227. if (null != rsp) {
  228. FacetField ff = rsp.getFacetField("title");
  229. List<Count> countList = ff.getValues();
  230. if (null == countList) {
  231. return null;
  232. }
  233. for (int i = 0; i < countList.size(); i++) {
  234. String tmp[] = countList.get(i).toString().split(" ");
  235. if (tmp[0].length() < 2) {
  236. continue;
  237. }
  238. sb.append(tmp[0] + " ");
  239. min--;
  240. if (min == 0) {
  241. break;
  242. }
  243. }
  244. words = sb.toString().split(" ");
  245. } else {
  246. return null;
  247. }
  248. return words;
  249. }
  250.  
  251. public static void main(String[] args) {
  252. initiate();
  253.  
  254. // 建立索引
  255. // goodList = goodsDAO.findAll();
  256. // System.out.println("所有商品载入完成!");
  257. // DeleteAllIndex();
  258. // System.out.println("原有索引已清除!");
  259. // System.out.println("添加索引开始!");
  260. // long starttime = System.currentTimeMillis();
  261. // addGoods(goodList, true);
  262. // long endtime = System.currentTimeMillis();
  263. // System.out.println("共耗时" + (endtime - starttime) + "ms!");
  264. // System.out.println("添加索引完成!");
  265.  
  266. // 进行查询
  267. SolrDocumentList solrList = null;
  268. QueryResponse rsp = null;
  269.  
  270. // rsp = Search("title", "*变形金* 蓝精灵", 0, 10, "buynum", false, true);
  271. // String field[] = { "title", "buynum", "discount", "starttime" };
  272. // String key[] = { "变形金刚 哈利波特", "[90 TO 100]", "[2.0 TO 3.0]",
  273. // "[2011-07-18T00:00:00.000Z TO 2011-07-19T00:00:00.000Z]" };
  274. String field[] = {"title"};
  275. String key[] = {"牛奶"};
  276. String sortfield[] = { "buynum" };
  277. Boolean flag[] = { false };
  278. long starttime = System.currentTimeMillis();
  279. rsp = Search(field, key, 0, 10, sortfield, flag, true);
  280. long endtime = System.currentTimeMillis();
  281. System.out.println("共耗时" + (endtime - starttime) + "ms!");
  282.  
  283. if (null != rsp) {
  284. solrList = rsp.getResults();
  285. for (int i = 0; i < solrList.size(); i++) {
  286. System.out.println(solrList.get(i).toString());
  287. }
  288. // 高亮显示部分
  289. System.out.println("搜索结果共" + solrList.size() + "条!");
  290. System.out.println("");
  291. Map<String, Map<String, List<String>>> hightlight = rsp
  292. .getHighlighting();
  293. List<GoodsBeans> tmpLists = rsp.getBeans(GoodsBeans.class);
  294. for (int i = 0; i < tmpLists.size(); i++) {
  295. String hlString = hightlight.get(tmpLists.get(i).getGoodId())
  296. .get("title").toString();
  297. if (null != hlString) {
  298. // System.out.println(hlString);
  299. }
  300. }
  301. }
  302.  
  303. // 自动补全
  304. // String words[] = autoComplete("哈利", 10);
  305. // if (null != words) {
  306. // System.out.println(words.length);
  307. // for (int i = 0; i < words.length; i++) {
  308. // System.out.println(words[i]);
  309. // }
  310. // }
  311. }
  312.  
  313. }

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. HBase协处理器同步二级索引到Solr

    一. 背景二. 什么是HBase的协处理器三. HBase协处理器同步数据到Solr四. 添加协处理器五. 测试六. 协处理器动态加载 一. 背景 在实际生产中,HBase往往不能满足多维度分析,我们 ...

  2. Multitier architecture

    Multitier architecture - Wikipedia https://en.wikipedia.org/wiki/Multitier_architecture Common layer ...

  3. NameNode和JobTracker的网络接口

    Hadoop快速入门 http://hadoop.apache.org/docs/r1.0.4/cn/quickstart.html

  4. MySQL安装、安装时未提示输入密码、如何修改密码小结

    http://blog.csdn.net/fr555wlj/article/details/54971412

  5. Servlet session的理解

    servlet参见http://blog.csdn.net/bryanliu1982/article/details/5214899 session参见http://lavasoft.blog.51c ...

  6. 通过powershell操作eventlog

    relevant command list ~\Desktop> (Get-Command Write-EventLog).Parameters Key Value --- ----- Warn ...

  7. HDU 2036:改革春风吹满地

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  8. html5--6-5 CSS选择器2

    html5--6-5 CSS选择器2 实例 学习要点 掌握常用的CSS选择器 了解不太常用的CSS选择器 什么是选择器 当我们定义一条样式时候,这条样式会作用于网页当中的某些元素,所谓选择器就是样式作 ...

  9. codeforces 414A A. Mashmokh and Numbers(素数筛)

    题目链接: A. Mashmokh and Numbers time limit per test 1 second memory limit per test 256 megabytes input ...

  10. object_funs.py

    #__init__ 构造方法,双下划线 #__del__ 析构方法,在对象就要被垃圾回收前调用.但发生调用 #的具体时间是不可知的.所以建议尽量避免使用__del__ print('-------ex ...