随笔:6 文章:0 评论:31 引用:0
BlogJava 首页 发新随笔
发新文章 联系 聚合管理

2005年11月4日

    今天终于考完junipor的免费大餐,一共5门,虽然不是非常的难,但也耗费了不少时间。总结一下,JNO-100别看是最低级的,由于其分数线要非常高,要85分,所以这门是最难的一门,很多人也是载在这门课程上的,过了这门,后面的jno-331,400为80分及格就显的简单多了,至于jno342,350的及格线为70分加上前面的熟读题目基本就是轻松过关了。
     哪位兄弟也想考该类认证,我可以分享考试用的题库。但由于不知道如何上传。留email吧
posted @ 2010-08-31 01:10 飞刀和雨 阅读(198) | 评论 (0)编辑 收藏
 
 

RubyJava之间的比较

(飞刀和雨)

1. 基本类型的比较Ruby的基本数据类型

1数值型(numeric)

Java拥有8种主治类型, Boolean,byte,char.short,int,long,float,double.在开发中我们往往只常用到boolean, char, int & double 

Ruby则巧妙的使用了2 FixnumBignum,而且ruby不需要你去定义这个数字类型,只需你输入个数,ruby会自动地进行必须的转换。用户不必担心数字之间的差别

 

 

ruby

Java

字符串转数字

N = ‘400’.to_i

N= new Integer(“400”).intValue( );

随机数

A = rand(5)

Random random = new java,util.Random();

 int A = random.nextInt(5);

 

Ruby提供良好的数学运算公式,这些是java.math 所不能够比拟的

1. 对数的使用:Math.loh(1)    Math.log10(1000)

2. 求矩阵算法,求解线形的方程组,复数的使用

 

2. 字符串类型(String

Java中处理字符串一般都是使用String类或者StringBuffer类,而ruby的使用则更加的方便和快速。Ruby的字符串的大小是可变的。可以无需使用更多的时间和内存。

 

 

ruby

Java

打印时变量带入字符串

Puts “This is #{number}”

System.out.println(“This is ”+number);

字符与值转换

?a è97

int x = (int)’a’;

大小写转换

s,downcase

s.lowerCase();

或得字符串部分

s[3.5]

s.indexOf(3,5);

 

 

3. 范围类型。

这类的文件是java所没有的,所以对于很多开发人员来说这是一个很新的类型,

代表了一个系列的值,当然

使用s..es…e。后面的一个不包括最后一个值

(-1..-5).to_a

posted @ 2007-05-17 15:18 飞刀和雨 阅读(1893) | 评论 (0)编辑 收藏
 
     摘要: 对 Cocoon 的认识和初步理解(飞刀和雨):   目标 ...  阅读全文
posted @ 2006-08-18 15:00 飞刀和雨 阅读(1526) | 评论 (0)编辑 收藏
 
     摘要: 关于luncene 内层的研究 (飞刀和雨)   这是很久以前做lucene 时的总结,现在已经不用去研究那些代码,但还是分享出来给大家以帮助。谢谢1.       从Index开始 无论哪种搜索引擎,都会需要自建一个index,所有的搜词准确率及快速性很大程度上取决于这类的问题。因此在建索引文件的时候,我们首先要弄清楚l...  阅读全文
posted @ 2006-03-02 23:31 飞刀和雨 阅读(1860) | 评论 (2)编辑 收藏
 
     摘要: 周六买了个netgear路由,讨价还价310买下,谁知道里面的安装说明书不详细,弄了一晚上没弄出来,周日中午打车去换了个,半小时搞定,看来电脑城里次品还是蛮多的,希望大家买电脑的时候要测试好在买,否则来回出租车费加上,估计可以换个108M的了。装好后在网上闲逛时发现有关这款路由的安装指南,居然是doc形式,难怪搜索不容易找到,现在取其精华,给以后购买者点帮助,呵呵。 第1步 将WGR614v...  阅读全文
posted @ 2006-02-13 17:11 飞刀和雨 阅读(6873) | 评论 (0)编辑 收藏
 

关于GoogleSuggest功能的实现

@@@使用AjaxLucene对其进行完美实现@@@ (飞刀和雨)

 

大家都对Googlesuggest的功能大概很有兴趣吧,我们觉得既然Google做的出,那么我们也能做出来,先对其进行分析,1.对于网页客户端的按键的动态变化,Ajax是最好的选择, google_suggest.JPG

2.如果数据库的选择,则可以有多种选择得,BerkeleyDB, Derby甚至自己做个txt文本文件,把所需要的单词和result数目放在文本文件里都能够实现,但今天我们有了一个很好的索引工具Lucene。加上Lucene对我的吸引力,因此今天我们用上大炮,卸去鸟枪。开始我们的开发之路。

 

首先,我们先建立个demo的框架,我就做了个这样的一个html文件,用了一个form,一个search_suggest.JPG 

输入的文本框,一个多选项和一个确认按键。后面两个没什么好说的,主要是文本框的设计,我做了以下的定义,<input  type="text" size=60 id="userid" name="q" autocomplete="off" onKeyUp="validate(event);"> 这样autocompleteoff指取消网页的cache,这样就不会弹出以前打过的字的窗口,造成混乱。onKeyUp是实现ajax的关键,相应键盘输入的操作。

 

其次,开始我们的Ajax了,顾名思义,Ajax指异步的javascriptxml. 我们的所有工作都会在javascript中完成,至于ajax原理,很多地方都有很详细的解释,这里就指列应用了。

 validate(e){

        var key=e.KeyCode;  //获得输入的键值

  //定义按键只对字母数字,空格,回车,Insdel有效,可以避免一些无效的相应,并//转发urlservlet,那么我们只要等servlet返回xml就可以了

  if (key>=48 && key<=90 || key==8 || key==32 || key== 45 || key==46){

       var url = "LuceneSearch?id=" + encodeURI(idField.value);

            req.open("GET", url, true);

          req.onreadystatechange = processRequest;

           req.send(null);

    }

}

这时,可以通过Ajax3req的请求进行向服务器发送,我们这里只要等待服务器返回的xml就可以了。

       function processRequest(){

             if(req.readyState==4){

                    if(req.status==200){

                           parseMessages();

                  }else{

                           clearTable();

                     }

              }

}

这里我们通过返回的状态, 得到一个XmlHttpreadyState=4表示servlet的操作结束,status

=200则表示Http得到正常的返回,这时调用parseMessage()就可以对所得到的XmlHttp进行操作,

      function parseMessages(){

              var products = req.responseXML.getElementsByTagName("products")[0];

              for (loop=0;loop<products.childNodes.length);loop++){

                     var product = products.childNodes[loop];

                     var productname = product.getElementsByTagName("pname")[0];

                     var productnumber = product.getElementsByTagName("pnumber")[0];

              }

}

这里我们就在javascipt里就得到了我们所需要的词的namenumber,然后就只要在javascript里填入一些特效,便能很方便的实现Googlesuggest.

 

其次,我们所需要的就事编写我们现在的LuceneSearchservlet. 这里因为通过get方式传递,这不对于开发j2ee的程序员来说,就是小菜一碟,我们只要定义doGet(req, res)就能可以了实现了。从这里我们得到了Text文本框里的字符串值。

public class LuceneSearch extends HttpServlet{

       public  void doGet(HttpServletRequest request, HttpServletResponse  response)

    throws IOException, ServletException {

              String targetId = request.getParameter("id");

       }

}

然后我们需要对这些字符串进行清理,去掉些无效的符号,然后把多余空格合并,成为一种真正的需要的字符串,然后我们需要用Lucene来进行搜索,先把Document把数据从数据库里读出来,然后制成Index。然后用Search来进行搜索,这里Lucene提供了很好的搜索方式,搜索分两种方式,一种是单个单词,这个就比较好办,Lucene 提供了开头匹配的方法PrefixQuery(), 直接套用就可以了

                      PrefixQuery query = new PrefixQuery(new Term("keyword", targetId));

                         IndexSearcher searcher = new IndexSearcher(directory);

                         Hits hits = searcher.search(query,sort);

                         for(int i=0; i<hits.length();i++){

                                          sb.append("<product>");

                                        sb.append("<pname>"+hits.doc(i).get("keyword")+"</pname>");

                                        sb.append("<pnumber>"+hits.doc(i).get("number")+"</pnumber>");

                                        sb.append("</product>");

                            }

这样我们就把搜索到的词和数量都放进Xml里了这样就出来了。

search_demo1.JPG

我们还可以注意到如果所需要的词并不在开头也能得到实现。

 

对于词组就比较费尽,因为首先要保证前面词的位置性,可以任意放置,最后一个词则必须以开头为基准进行模糊查找,这样才能实现其功能,还好Lucene还是考虑到了这点,有个PhrasePrefixQuery()的方法,稍稍加以改进便可以实现,

              //首先要把词组用split以空格分开

              String[] targetIdArray = targetId.split(" ");

               PhrasePrefixQuery query = new PhrasePrefixQuery();

               for(int i=0; i<targetIdArray.length-1;i++){

                   query.add(new Term("keyword",targetIdArray[i]));

               }

               query.setSlop(4);        //设置词前后位置移动范围。

               LinkedList termsWithPrefix = new LinkedList();

               IndexReader ir = IndexReader.open(directory);

               TermEnum te = ir.terms(new Term("keyword", targetIdArray[targetIdArray.length-1]));

               do {

                  if (te.term().text().startsWith(targetIdArray[targetIdArray.length-1])) {

                        termsWithPrefix.add(te.term());

                  }

               } while (te.next());

这样我们先得到最后一个单词为开头的词,然后加到PrasePrefixQuery

               query.add((Term[])termsWithPrefix.toArray(new Term[0]));

               Hits hits;

               hits = searcher.search(query, sort);

               for(int i=0; i<(hits.length()>20?20:hits.length());i++){

                     sb.append("<product>");

                     sb.append("<pname>"+hits.doc(i).get("keyword")+"</pname>");

                     sb.append("<pnumber>"+hits.doc(i).get("popularity")+"</pnumber>");

                     sb.append("</product>");

              }

这样我们就可以得到我们所需要的词组了。如图所示,很方便吧,这里就基本完成了google

search_demo2.JPG

所代表的suggest功能,当然,javascript里面还有一些上下键,鼠标移动事件的触发,加在一起就会把我们的网页弄得很完美了。但这些都不是重点,我们主要是对门户网站功能的实现,如果有问题和建议,可以给我留言,谢谢。

posted @ 2005-11-04 16:45 飞刀和雨 阅读(3617) | 评论 (29)编辑 收藏
CALENDER
<2005年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(4)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜


Powered By: 博客园
模板提供沪江博客