首页 > 其他分享 >《自己动手建搜索引擎》日志分析类代码解析与修正为兼容lucene3.0.2

《自己动手建搜索引擎》日志分析类代码解析与修正为兼容lucene3.0.2

时间:2023-09-07 10:32:51浏览次数:50  
标签:04 indexOf lucene3.0 兼容 blog continue DEBUG 日志 readline


搜索日志是用来分析用户搜索行为和信息需求的重要依据。一般记录如下信息:

  • 搜索关键字
  • 用户来源IP
  • 本次搜索返回结果数量
  • 搜索时间
  • 其他需要记录的应用相关信息

   例如:搜索时间|日志类型|搜索类型|搜索关键字|IP地址|本次搜索返回结果数量, 存放日志文件内容如下:

2008 
  - 
  04 
  - 
  04 
  12 
  : 
  01 
  : 
  19. 
  2876 
  |DEBUG 
  |blog 
  |title 
  :瑞丽女性网 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  8 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  01 
  : 
  22. 
  1626 
  |DEBUG 
  |blog 
  |title 
  :瑞丽女性网 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  8 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  01 
  : 
  35. 
  0376 
  |DEBUG 
  |blog 
  |的 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  01 
  : 
  44. 
  0688 
  |DEBUG 
  |blog 
  |的 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  03 
  : 
  31. 
  1938 
  |DEBUG 
  |blog 
  |清明,祭奠我所有的过去... 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  1 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  37 
  : 
  19. 
  7720 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  37 
  : 
  39. 
  7563 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  39 
  : 
  08. 
  8657 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  42 
  : 
  12. 
  6313 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  42 
  : 
  19. 
  4282 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  42 
  : 
  46. 
  8657 
  |DEBUG 
  |blog 
  |清明 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  12 
  : 
  48 
  : 
  23. 
  8813 
  |DEBUG 
  |blog 
  |可见要想吃上这里的爆肚还要赶早不赶晚啊 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  1 
  
2008 
  - 
  04 
  - 
  04 
  15 
  : 
  55 
  : 
  57. 
  1470 
  |DEBUG 
  |blog 
  |aaa 
  | 
  127. 
  0. 
  0. 
  1 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  15 
  : 
  57 
  : 
  23. 
  4282 
  |DEBUG 
  |blog 
  |aaa 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  16 
  : 
  06 
  : 
  40. 
  1626 
  |DEBUG 
  |blog 
  |汽车 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
  
2008 
  - 
  04 
  - 
  04 
  16 
  : 
  06 
  : 
  46. 
  7563 
  |DEBUG 
  |blog 
  |汽车 
  | 
  222. 
  130. 
  192. 
  109 
  | 
  10 
 
《自己动手写搜索引擎》日志分析源代码解析:
 
package org.apache.log; 
 
import java.io.BufferedReader; 
 
import java.io.BufferedWriter; 
 
import java.io.File; 
 
import java.io.FileInputStream; 
 
import java.io.FileOutputStream; 
 
import java.io.InputStreamReader; 
 
import java.io.OutputStreamWriter; 
 
import java.util.HashMap; 
 
import java.util.StringTokenizer; 
 
import java.util.HashSet; 
 
//这里是分析搜索日志的部分 
 
public 
 class SearchLog2File { 
 
  
 /**
  * @param args
  */ 
 
  
 public 
 static 
 void main(String[] args) 
 throws Exception { 
 
  String logPath 
 = 
 "E:/Java Projects/ses/src/test/lucene/dic/log"; 
 //日志文件所在目录 
 
  String searchWords 
 = 
 "E:/Java Projects/ses/src/test/lucene/dic/searchword/searchWords1.txt"; 
 //日志分析后数据存放路径 
 
   
 
  logFiler(logPath,searchWords); 
 
 } 
 
  
 
  
 /**
  * 日志分析
  * @param logPath 日志文件存放目录
  * @param searchWords 日志分析后数据存放文件路径
  * @throws Exception
  */ 
 
  
 public 
 static 
 void logFiler(String logPath,String searchWords) 
 throws Exception { 
 
   
 
  FileOutputStream fos 
 = 
 new FileOutputStream(searchWords); 
 
  OutputStreamWriter osw 
 = 
 new OutputStreamWriter(fos, 
 "GBK"); 
 
  BufferedWriter bw 
 = 
 new BufferedWriter(osw); 
 
   
 
  File file 
 = 
 new File(logPath); 
 
  File[] fileArray 
 = file.listFiles(); 
 
   
 
  String readline; 
 //读取一行 
 
  String strIP ; 
 // 存放IP地址 
 
  String strCont ; 
 // 存放搜索内容 
 
   
 
   
 for ( 
 int i 
 = 
 0; i 
 < fileArray.length; i 
 ++) { 
 
   String fileName 
 = fileArray[i].getName(); 
 
    
 if ( 
 !(fileName.endsWith( 
 ".txt"))) 
 
     
 continue; 
 
   HashMap 
 <String,HashSet 
 <String 
 >> word2IP 
 = 
 
     
 new HashMap 
 <String,HashSet 
 <String 
 >>(); 
 //存放IP 
 
   HashMap 
 <String,Integer 
 > word2ResultNum 
 = 
 new HashMap 
 <String,Integer 
 >(); 
 //存放命中个数 
 
    
 
   String fileDate 
 = fileName.substring( 
 0, 
 10); 
 
   System.out.println(fileDate); 
 
    
 
   FileInputStream fileInputStream 
 = 
 new FileInputStream(logPath 
 + 
 "/" 
 
      
 + fileName); 
 
   InputStreamReader fsr 
 = 
 new InputStreamReader(fileInputStream); 
 
   BufferedReader br 
 = 
 new BufferedReader(fsr); 
 
    
 //处理在日志中经常出现的乱码 
 
    
 while ((readline 
 = br.readLine()) 
 != null) { 
 
     
 if (readline.indexOf( 
 "?") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 ",") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "=") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "骞") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐭") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "︾") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐢佃") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "╂") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐜") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鶶") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "^") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "廸") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "閸") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "嬭") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鍟") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鏂") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "籂") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "濞") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐑") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "瓙") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "ユ") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "磿") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "嬫") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "傚") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐥") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "滅") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "閻") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "彛") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "寮") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "儤") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "闁") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "闈") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "湇") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鍏") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "潡") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "庡") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "笅") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鐣") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "冩") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "撳") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鏉") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "彿") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "搧") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "笅") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "鎺") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "闂") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "閺") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "墖") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "夎") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "浜") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "褰") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "锟斤") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 if (readline.indexOf( 
 "AND ") 
 > 
 = 
 0) 
 
      
 continue; 
 
     
 
     
 // 
 
     
 // System.out.println("readline:"+readline); 
 
     
 //日志格式如:2008-04-04 16:06:40.1626|DEBUG|blog|汽车|222.130.192.109|10 
 
    StringTokenizer st 
 = 
 new StringTokenizer(readline, 
 "|"); 
 
     
 
     
 if (st.hasMoreTokens()) { 
 
     st.nextToken(); 
 //2008-04-04 16:06:40.1626 
 
      
 if ( 
 !st.hasMoreTokens()) 
 
       
 continue; 
 
     st.nextToken(); 
 //DEBUG 
 
      
 if ( 
 !st.hasMoreTokens()) 
 
       
 continue; 
 
     st.nextToken(); 
 //blog 
 
      
 if ( 
 !st.hasMoreTokens()) 
 
       
 continue; 
 
     strCont 
 = st.nextToken(); 
 //汽车 
 
      
 
      
 //下面几行代码主要处理:当检索“汽车 汽车”则当做“汽车”;但是也只能处理这种情况,如“汽车 美容 汽车”它也就不会处理成“汽车 美容” 
 
     StringTokenizer stQuery 
 = 
 new StringTokenizer(strCont, 
 " "); 
 
     String key1; 
 
     String key2; 
 
      
 if(stQuery.hasMoreTokens())   
 
     { 
 
      key1 
 = stQuery.nextToken(); 
 
       
 if(stQuery.hasMoreTokens()) 
 
      { 
 
       key2 
 = stQuery.nextToken(); 
 
        
 if(key1.equals(key2)) 
 
       { 
 
        strCont 
 = key1; 
 
         
 //System.out.println(strCont); 
 
       } 
 
      } 
 
     } 
 
      
 if(strCont.length() 
 > 
 20 
 || strCont.length() 
 < 
 2 ) 
 //收录的检索关键字长度限制在2-20字符之间 
 
     { 
 
       
 continue; 
 
     }      
 
      
 if (strCont.indexOf( 
 ":") 
 > 
 = 
 0) 
 //过滤掉这种记录:2008-04-04 12:01:19.2876|DEBUG|blog|title:瑞丽女性网|222.130.192.109|8 
 
       
 continue; 
 
      
 if ( 
 !st.hasMoreTokens()) 
 
       
 continue; 
 
     strIP 
 = st.nextToken(); 
 //222.130.192.109 IP地址 
 
      
 if ( 
 !st.hasMoreTokens()) 
 
       
 continue; 
 
      
 int resultNum 
 = 
 0; 
 
      
 try 
 
     { 
 
      resultNum 
 = Integer.parseInt(st.nextToken()); 
 //10 命中个数 
 
     } 
 
      
 catch(NumberFormatException e) 
 
     {} 
 
      
 
      
 //System.out.println(strIP); 
 
      
 if (word2IP.containsKey(strCont)) { 
 //检索关键字已记录 
 
      HashSet 
 <String 
 > ips 
 = word2IP.get(strCont); 
 
      ips.add(strIP); 
 //则根据IP地址当做频率数,相同IP检索相同的关键字则认作一次操作 
 
     } 
 else 
 if(resultNum 
 > 
 0) { 
 
      HashSet 
 <String 
 > ips 
 = 
 new HashSet 
 <String 
 >(); 
 
      ips.add(strIP); 
 
      word2IP.put(strCont, ips); 
 
      word2ResultNum.put(strCont, resultNum); 
 //记录命中数,这里并没有考虑可能下一次检索出来的命中数与当前命中数不同的情况 
 
     } 
 
    } 
 
   } 
 
    
 
    
 //写入searchWords文件中或插入数据库日志表,在下面可根据自己的要求修改 
 
    
 for (java.util.Map.Entry 
 <String,HashSet 
 <String 
 >> e 
 : 
 
       word2IP.entrySet()) { 
 
     
 //stmt.setString(1, e.getKey()); 
 
     
 //stmt.setInt(2, e.getValue().size()); 
 
     
 //stmt.setInt(3, word2ResultNum.get(e.getKey())); 
 
     
 //stmt.setDate(4, new Date((searchDate).getTime())); 
 
     
 //stmt.executeUpdate(); 
 
     
 
    bw.write(e.getKey() 
 + 
 "%" 
 + 
 
    word2ResultNum.get(e.getKey()) 
 + 
 "%" 
 + 
 
    e.getValue().size()); 
 
    bw.write( 
 "/n"); 
 
     
 
     
 //System.out.println(e.getKey()+"%" + 
 
     
 //  word2ResultNum.get(e.getKey()) + "%" + 
 
     
 //  e.getValue().size()); 
 
     
 
   } 
 
  } 
 
  bw.close(); 
 
 } 
 
}


      从代码可看出日志的内容存在很大局限性,可适用于简单日志利用,但很难满足企业搜索或商务网站搜索的需求。

 

标签:04,indexOf,lucene3.0,兼容,blog,continue,DEBUG,日志,readline
From: https://blog.51cto.com/u_2544485/7394856

相关文章

  • 监听日志来排查连接风暴
    一.监听日志:01-MAR-201800:02:09*(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=crmdb2)(INSTANCE_NAME=crmdb21)(CID=(PROGRAM=UnifyFileDeal)(HOST=ncrminf2)(USER=intfile)))*(ADDRESS=(PROTOCOL=tcp)(HOST=10.32.205.240)(PORT=60854))*establish*crmdb2*001-M......
  • spring boot logback日志显示时间差8小时
    参考:https://blog.csdn.net/u014453475/article/details/100579856官方文档:Thesecondparameterspecifiesatimezone.Forexample,the'%date{HH:mm:ss.SSS,Australia/Perth}wouldprintthetimeinthetimezoneofPerth,Australia,theworld'smostiso......
  • 慢查询日志
    慢查询日志要开启MySQL慢查询日志,可以按照以下步骤进行操作: 编辑MySQL的配置文件my.cnf(或者my.ini),找到[mysqld]部分。vi/etc/my.cnf在[mysqld]部分添加以下配置:slow_query_log=1slow_query_log_file=/var/log/mysql/slow_query.loglong_query_time=2log_queries......
  • 三维模型OBJ格式轻量化的跨平台兼容性问题分析
    三维模型OBJ格式轻量化的跨平台兼容性问题分析 三维模型的OBJ格式轻量化在跨平台兼容性方面具有重要意义,可以确保模型在不同平台和设备上的正确加载和渲染。本文将分析OBJ格式轻量化的跨平台兼容性技术,并探讨其在保证数据一致性、支持多种平台和工具以及提供灵活性方面的作用......
  • 27. 日志
    一、日志的基本使用logger.debug(msg,*args,**kwargs)#输出调试日志logger.info(msg,*args,**kwargs)#输出消息日志logger.warning(msg,*args,**kwargs)#输出警告日志logger.error(msg,*args,**kwargs)#输出错误日志logger.criti......
  • linux日志文件的查询方式
    cdlog到指定log日志文件目录ls查看当前文件存在的目录catjujube.log可以查看较小的日志文件vijujube.log查看较大的日志文件(常用)/(查询的字符)可以定位到这个字符的位置N继续向下检索:$回到日志文件的最底层可以用于从底层开始查找使用:$后配合使......
  • 【css兼容】flex在低版本 chrome 浏览器的兼容问题
    https://blog.csdn.net/weixin_43841308/article/details/111246537 前言【感官】使用ElementUI构建如下布局【逻辑】具体代码:【现象】谷歌浏览器44.0.2403.125m版本显示main内容不全谷歌浏览器57.0.2987.133版本页面正常flex兼容性【猜想】display:flex在网站兼容性......
  • 解决代码使用CompletableFuture做异步时spring-cloud-starter-sleuth的日志追踪号为空
    产生问题原因就是异步调用,导致spanId和traceId丢失了@Async注解的异步调用是没问题的前提使用spring-cloud-starter-sleuthjar包版本2.2.8.RELEASE关于追踪号的xml配置为<pattern>%yellow(%date{yyyy-MM-ddHH:mm:ss.SSS})[%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-B......
  • C#下log4net日志记录使用实例完整教程
    C#下log4net日志记录使用实例完整教程1log4net1.1log4net简介1.2log4net源码下载1.3log4net源码编译1.3.1编译工具1.3.2编译步骤1.3.2.1解压log4net源码apache-log4net-source-2.0.10.zip1.3.2.2找到文件“……\log4......
  • 拥抱国产化,生态软件信创兼容适配之路
    国产化是指技术引进项目投产后所生产的产品中,国内生产件的数量占整件产品生产件数量。换句话说,软件国产化的占比,直接影响到技术是否会在某一个时点上被”卡脖子“。随着国家经济的发展和技术水平的提高,国家整体实力大大增强的基础上,出现了纷繁复杂的国与国之间的关系。顺应的,如果还......