设为首页 收藏本站
查看: 1065|回复: 0

[经验分享] solr如何进行搜索实战,关键字全库搜索

[复制链接]

尚未签到

发表于 2017-12-19 13:43:01 | 显示全部楼层 |阅读模式
  相关文章:第一篇要是安装部署,第二篇如何定时同步mysql数据。第三篇solr实战关键字查询全库
  简单说一下solr自动定时同步数据的原理,个人理解而已
  做solr定时同步mysql数据,
  先贴出关键代码:
DSC0000.png

  一、有几个地方要注意:
  1,全库中要又一个同名,切内容不重复的字段,比如id,生成方式为uuid。因为${dih.delta.id},这个id应该是数据表的id,因为我尝试用 表名_+id的新的pk=“tid”,写成 ${dih.delta.tid},报错。
  2,每个表要又一个updatetime(其他名字也可以),类型位datetime,date应也可以,默认为NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,上图就知道这个的必要
  如何设置:例如alter table house modify  updatetime TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,(TIMESTAMP  容易写漏掉)当数据更新的时候,默认值位当前时间
  二、solr定时同步mysql数据思路
  solr加上配置上监听器之后,定时的去查询mysql数据,将上次更新的一个时间和updatetime比对,如果发现updatetime大于这个时间,再看看这个id是否在在solr引擎中存在,决定是更新还是在solr引擎中修改数据。
  三、进入搜索正题:
  我们先看看solr的客户端界面,
DSC0001.png

  我的理解是“q”是大的搜索,“fq”是在这个搜索下面进一步过滤;举个例子q=description:*李刚*,fq=searchType:*1*,这里查询的表a中的李刚,searchType为1代表a,b表类型位2之类。
  为什么要这样写,貌似默认  *:*李刚*,这种查询方式是不支持(修改源码就不说了),那:前面写什么呢,才能够搜索全部字段呢,我们把需要能够搜索的字段全部拼接到别名字段description中,
  然后就又我上面写的方式了。
  四、如何结合java代码呢,
  在pom.xml中引入(版本和你solr版本对应,之前用的6.6.0的版本发现原来提供的方法有问题,于是自己解析):
  SolrDocumentList results = queryResponse.getResults();//这句代码又问题
  引入jar包
  <dependency>
  <groupId>org.apache.solr</groupId>
  <artifactId>solr-solrj</artifactId>
  <version>6.6.0</version>
  </dependency>
  源代码:
  //keyword 为关键字,而且是decode编码过的,json解析引入的alibb的json工具
  public String search(HttpServletRequest request,PageInfo page,Integer type,String keyword) throws SolrServerException, IOException {                        
  //搜索结果                             
  String param="fq=searchType:*"+type+"*&indent=on&q=description:*"+keyword+"*&rows="+page.getRows()+"&start="+startnum+"&wt=json";         
  String serverUrl2 = "http://localhost:8080/solr/big/select";
  String data=GetDataByUrl.SendGET(serverUrl2, param);            
  //            System.out.println(data);
  //解析数据
  JSONObject jo=JSONObject.parseObject(data);            
  String  res=jo.get("response").toString();
  JSONObject resb=JSONObject.parseObject(res);
  Integer numFound=Integer.valueOf(resb.get("numFound").toString());
  String  docs=resb.get("docs").toString();
  //json结果数组
  JSONArray resultArray = JSONArray.parseArray(docs);
  //查询出来的数量
  //Long numFound = results.getNumFound();            
  client.close();                     
  return returnUrl;
  }
  工具类:
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.net.URL;
  import java.net.URLConnection;
  import java.util.List;
  import java.util.Map;
  import com.alibaba.fastjson.JSONArray;
  import com.alibaba.fastjson.JSONObject;

  public>  public static String SendGET(String url,String param){
  String result="";//访问返回结果
  BufferedReader read=null;//读取访问结果
  try {
  //创建url
  URL realurl=new URL(url+"?"+param);
  //打开连接
  URLConnection connection=realurl.openConnection();
  // 设置通用的请求属性
  connection.setRequestProperty("accept", "*/*");
  connection.setRequestProperty("connection", "Keep-Alive");
  connection.setRequestProperty("user-agent",
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
  //建立连接
  connection.connect();
  // 获取所有响应头字段
  Map<String, List<String>> map = connection.getHeaderFields();
  // 遍历所有的响应头字段,获取到cookies等
  for (String key : map.keySet()) {
  System.out.println(key + "--->" + map.get(key));
  }
  // 定义 BufferedReader输入流来读取URL的响应
  read = new BufferedReader(new InputStreamReader(
  connection.getInputStream(),"UTF-8"));
  String line;//循环读取
  while ((line = read.readLine()) != null) {
  result += line;
  }
  } catch (IOException e) {
  e.printStackTrace();
  }finally{
  if(read!=null){//关闭流
  try {
  read.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  }
  return result;
  }
  public static void main(String args[]){
  String serverUrl = "http://192.168.0.70:8983/solr/big/select";
  //String param="fq=searchType:*1*&indent=on&q=description:*%25E5%2591%25A8%25E4%25B8%25BD*&wt=json";
  String param="fq=searchType:*1*&indent=on&q=description:*%E5%91%A8%E4%B8%BD*&wt=json";
  String data=GetDataByUrl.SendGET(serverUrl, param);
  System.out.println(data);
  JSONObject jo=JSONObject.parseObject(data);
  String  res=jo.get("response").toString();
  JSONObject resb=JSONObject.parseObject(res);
  Integer numFound=Integer.valueOf(resb.get("numFound").toString());
  String  docs=resb.get("docs").toString();
  //JSONObject resb=new JSONObject(docs);
  //JSONArray array = JSONArray.parseArray("");
  JSONArray resultArray = JSONArray.parseArray(docs);
  }
  }
  qq 1195748576

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425710-1-1.html 上篇帖子: Solr.NET快速入门(八)【多核多实例,映射验证】 下篇帖子: 2.跟我学solr
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表