zoukankan      html  css  js  c++  java
  • solr如何进行搜索实战,关键字全库搜索

    相关文章:第一篇要是安装部署第二篇如何定时同步mysql数据第三篇solr实战关键字查询全库

    简单说一下solr自动定时同步数据的原理,个人理解而已

    做solr定时同步mysql数据,

    先贴出关键代码:

    一、有几个地方要注意:

    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的客户端界面,

    我的理解是“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 class GetDataByUrl {
        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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/longsanshi/p/7380739.html
Copyright © 2011-2022 走看看