• 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

  • 相关阅读:
    JavaScript排序算法——快速排序
    JavaScript排序算法——归并排序
    JavaScript排序算法——堆排序
    JavaScript排序算法——插入排序
    ubuntu sublime text3 lisence
    jQuery学习笔记——弹出对话框
    CSS学习笔记——响应式布局
    CSS学习笔记——选择器
    JavaScript学习笔记——事件
    JavaScript学习笔记——节点
  • 原文地址:https://www.cnblogs.com/longsanshi/p/7380739.html
Copyright © 2020-2023  润新知