??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
Q飞刀和雨Q?/span>
1Q?nbsp;基本cd的比?/span>Ruby的基本数据类?/span>
1数值型(numeric)
Java拥有8U主ȝ?/span>, Boolean,byte,char.short,int,long,float,double.在开发中我们往往只常用到boolean, char, int & double?/span>
Ruby则y妙的使用?/span>2c?/span> Fixnum?/span>BignumQ而且ruby不需要你d义这个数字类型,只需你输入个敎ͼruby会自动地q行必须的{换。用户不必担心数字之间的差别
|
ruby |
Java |
字符串{数字 |
N = ‘ |
N= new Integer(“ |
随机?/span> |
A = rand(5) |
Random random = new java,util.Random(); int A = random.nextInt(5); |
Ruby提供良好的数学运公式,q些?/span>java.math 所不能够比拟的
1. Ҏ(gu)的用:Math.loh(1) Math.log10(1000)
2. 求矩늮法,求解UŞ的方E组Q复数的使用
2Q?span> 字符串类型(StringQ?/span>
Java中处理字W串一般都是?/span>StringcL?/span>StringBufferc,?/span>ruby的用则更加的方便和快速?/span>Ruby的字W串的大是可变的。可以无需使用更多的时间和内存?/span>
|
ruby |
Java |
打印时变量带入字W串 |
Puts “This is #{number}” |
System.out.println(“This is ”+number); |
字符与D{?/span> |
?a è97 |
int x = (int)’a’; |
大小写{?/span> |
s,downcase |
s.lowerCase(); |
或得字符串部?/span> |
s[3.5] |
s.indexOf(3,5); |
3Q?span> 范围cd?/span>
q类的文件是java所没有的,所以对于很多开发h员来说这是一个很新的cdQ?/span>
代表了一个系列的|当然
使用s..e?/span>s…e。后面的一个不包括最后一个?/span>
(-1..-5).to_a
@@@使用Ajax?/SPAN>Lucene对其q行完美实现@@@ (飞刀和雨)
大家都对Google?/SPAN>suggest的功能大概很有兴吧Q我们觉得既?/SPAN>Google做的出,那么我们也能做出来,先对其进行分析,1.对于|页客户端的按键的动态变化,Ajax是最好的选择Q?/SPAN>
2.如果数据库的选择Q则可以有多U选择得,BerkeleyDB, Derby甚至自己做个txt文本文gQ把所需要的单词?/SPAN>result数目攑֜文本文g里都能够实现Q但今天我们有了一个很好的索引工具Lucene。加?/SPAN>LuceneҎ(gu)的吸引力Q因此今天我们用上大炮,卸去鸟枪。开始我们的开发之路?/SPAN>
首先Q我们先建立?/SPAN>demo的框Ӟ我就做了个这L一?/SPAN>html文gQ用了一?/SPAN>form,一?/SPAN>
输入的文本框Q一个多选项和一个确认按键。后面两个没什么好说的Q主要是文本框的设计Q我做了以下的定义,<input type="text" size=60 id="userid" name="q" autocomplete="off" onKeyUp="validate(event);"> q样autocompleteQ?/SPAN>off指取消网늚cacheQ这样就不会弹出以前打过的字的窗口,造成混ؕ?/SPAN>onKeyUp是实?/SPAN>ajax的关键,相应键盘输入的操作?/SPAN>
其次Q开始我们的Ajax了,思义Q?/SPAN>Ajax指异步的javascript?/SPAN>xml. 我们的所有工作都会在javascript中完成,至于ajax原理Q很多地斚w有很详细的解释,q里指列应用了?/SPAN>
validate(e){
var key=e.KeyCode; //获得输入的键?/SPAN>
//定义按键只对字母数字Q空|回RQ?/SPAN>Ins?/SPAN>del有效Q可以避免一些无效的相应Qƈ//转发urll?/SPAN>servlet,那么我们只要{?/SPAN>servletq回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);
}
}
q时Q可以通过Ajax?/SPAN>3?/SPAN>req的请求进行向服务器发送,我们q里只要{待服务器返回的xml可以了?/SPAN>
function processRequest(){
if(req.readyState==4){
if(req.status==200){
parseMessages();
}else{
clearTable();
}
}
}
q里我们通过q回的状?/SPAN>, 得到一?/SPAN>XmlHttp?/SPAN>readyState=4表示servlet的操作结束,status
=200则表C?/SPAN>Http得到正常的返回,q时调用parseMessage()可以对所得到?/SPAN>XmlHttpq行操作Q?/SPAN>
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];
}
}
q里我们在javascipt里就得到了我们所需要的词的name?/SPAN>number,然后只要在javascript里填入一些特效,便能很方便的实现Google?/SPAN>suggest.
其次Q我们所需要的׃~写我们现在?/SPAN>LuceneSearch?/SPAN>servlet. q里因ؓ通过get方式传递,q不对于开?/SPAN>j2ee的程序员来说Q就是小菜一,我们只要定义doGet(req, res)p可以了实C。从q里我们得到?/SPAN>Text文本框里的字W串倹{?/SPAN>
public class LuceneSearch extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String targetId = request.getParameter("id");
}
}
然后我们需要对q些字符串进行清理,L些无效的W号Q然后把多余I格合ƈQ成ZU真正的需要的字符Ԍ然后我们需要用Lucene来进行搜索,先把Document把数据从数据库里d来,然后制成Index。然后用Search来进行搜索,q里Lucene提供了很好的搜烦方式Q搜索分两种方式Q一U是单个单词Q这个就比较好办Q?/SPAN>Lucene 提供了开头匹配的Ҏ(gu)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>");
}
q样我们把搜烦到的词和数量都放q?/SPAN>Xml里了q样出来了?/SPAN>
我们q可以注意到如果所需要的词ƈ不在开头也能得到实现?/SPAN>
对于词组比较费,因ؓ首先要保证前面词的位|性,可以L攄Q最后一个词则必M开头ؓ基准q行模糊查找Q这h能实现其功能Q还?/SPAN>Luceneq是考虑Cq点Q有?/SPAN>PhrasePrefixQuery()的方法,E稍加以改进便可以实玎ͼ
//首先要把词组?/SPAN>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); //讄词前后位|移动范围?/SPAN>
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());
q样我们先得到最后一个单词ؓ开头的词,然后加到PrasePrefixQuery?/SPAN>
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>");
}
q样我们可以得到我们所需要的词组了。如图所C,很方便吧Q这里就基本完成?/SPAN>google
所代表?/SPAN>suggest功能Q当Ӟjavascript里面q有一些上下键Q鼠标移动事件的触发Q加在一起就会把我们的网弄得很完美了。但q些都不是重点,我们主要是对门户|站功能的实玎ͼ如果有问题和Q可以给我留aQ谢谢?/SPAN>