项目:法律法规库
2011-07-24
工作内容:
1,重构了导入数据的代码,将文件中的中文字段以及表的列名提取出来放到属性文件中,根据属性文件动态构建sql
异常:sql sytax exception near database,pic...
原因:database是mysql关键字
解决:将database改成db
存在的问题:
1,数据不完整,有些可能是必填字段(标题和数据库),但没有值.
2,日期不完整,或错误,有些只给了年份,有的年份错误,影响录入. (对策:直接修改源文件,日期200.10.16被改成2000.10.16,然后转成长整形录入.如果需要更改直接修改数据库的字段)
3,属性文件包含中文,读取时出现乱码.
2011-07-25
工作内容:
1,新建个备份表laws_and_regulations2,用重新构建的importData类导入原始数据,其中日期被表示为长整形(原表为varchar,存储日期字符串如2006.12.11)
异常:sql out of range ...publish_time -2.789323E9
原因:数值超出了mysql中INT的取值范围
解决:将INT改成BIGINT
2011-07-27
工作内容:
1,需求确定,初步决定用coreseek实现全文检索
异常:coreseek配置文件在记事本下修改后无法被读取
原因:怀疑是编码问题
解决:用ultraedit
2011-08-17
经过三星期的酱油,项目基本有了样子.前端检索功能已经搞定,后台建立索引,增删改查,日志等也已经实现.
检索采用solr+IK分词.1G左右的小文本查询时间都不到1秒,在可见的未来,文本量不会明显增加,所以速度这块暂时不是问题.倒是索引文件一共4G.这个有点大了,如果采用双核做备份的话,很占空间.优化索引结构是今后要解决的问题.目前考虑从分词器入手.由于对这块实在陌生,还要仔细研究研究.
程序方面,查询的拼接,以及客户端建立索引的写法还不理想,尤其是索引的建立,为了防止内存溢出,需要不断的访问服务器获取索引的状态.个人觉得还有改进的空间
有待解决的问题:
后台需要给编辑更多的提示,日志需要加入搜索功能,更新缓存,建立备份索引用来即时切换.
2011-08-24
尝试将索引连接到前台,发现复杂度远远超过预期.同一时刻只有一个线程可以建索引,后面的请求会被忽略掉,于是采用单例+同步的方式.但建立索引时间很长,用synchronized会导致没拿到锁的线程无限等待,这个实现就比较糟糕.如果锁被占用,应该立即返回并给用户反馈,后来发现ReentrantLock符合要求,tryLock()方法可以判断当前对象是否被锁住,如果锁被占用,则返回false,这样程序可以立即返回,告知用户其他人正在执行索引创建工作.如果此时锁空闲,则获取此对象锁,之后开启新线程去执行创建索引工作,然后主线程返回,告知用户正在创建索引.不过由于对多线程没什么了解,实现起来还颇费工夫.而且dwr的单例写法总是不成功,最后只好那全静态方法类去顶替.
同步做好了之后,怎么显示给用户也是麻烦.想了很久决定将索引信息插入数据库,然后前台轮询,拿到结果集之后,去做一个类似微博新消息的图层.capacityFixed插件还是很给力地完成了大部分工作,不过处理具体显示的信息也颇费神,包括成功失败分开显示,忽略,在新窗口中查看,查看或者忽略之后还要去数据库里把状态位改掉.拿到或没拿到锁的情况下,要给用户提示,而confirm,alert这种东西丑的连我都果断忍不下去了,明天还要找找相关插件.
话说回来,比较讽刺的是,这种功能编辑可能一年都用不了一回,甚至不给他们手动索引的接口都没问题,我为什么要大费周章的写这么个东西=.=连我也不清楚.
不过以后如果有相关需求,倒是可以借鉴这里的思路.
作为第一个独立做的项目,我还是从中得到很多经验教训,至少在以后的工作中,除非闲的DT,否则绝不应该先做这种功能,什么简单做什么,什么能反映到界面,让用户看出来,就先做什么.免得N多天过去了,人家一看你好像啥都没干,光打酱油了...
后面要坚持记日记了...
明天工作内容:
1,联系编辑,把字段的格式,哪些非空,分类一和分类二的关系弄清楚.然后制定更新缓存的方案.
2,把索引相关的功能完成
3,前台看看有么有需要完善的,法律标题肯定要截一下,不然太长,格式也乱了,检索的信息也应该排一下版.要不要做个tooltip...要不要呢,要不要呢...
还是应该尽快完成功能,今后去研究solr才是正道...
今天学到的东西
background-repeat: no-repeat 可以让背景填充整个空白,而不是不断重复
其他的忘了=.=
2011-09-05
操作缓存的同步问题.
2011-09-08
pre自动换行,防止撑开页面:
table{
TABLE-LAYOUT: fixed;
}
pre{
white-space: pre-wrap;word-wrap: break-word;
}
2011-09-10
防止input type=image自动刷新
<input type="image" src="web/style/images/resetButton.png" οnclick="AdvancedSearchApp.resetInput();return false;"> 加入return false;
2011-09-15
div左右布局
<div style="width:100">
<div style="float:left;width:50px"></div>
<div style="float:right:width:50px;margin-right: 0px !important;margin-right: -40px;"></div>
</div>
要点:子div必须制定宽度,IE6中第二个子div不会向右浮动,这样会导致错位,于是加margin处理
2011-09-26
<tr>
<td><s:property value="pl.pageShowString" escape="false"/></td>
</tr>
不能放在表单内,因为pages会自动生成表单