项目经理要偶在公司已有的网站中加入站内搜索引擎,注意:此网站是用ASP已经开发好的成品网站,同事给了一个开源项目dotLucene,是用VS2005完成的,偶的工作就是把此开源项目优化到公司要求,然后加入到网站中。对了,还有一个重要的是对于一个搜索结果的排名显示,好比百度的竞价排名一样,本人不提倡这种排名方式,明显有失公平。过程中也遇到了一些问题,因为文章没有伴随开发一起完成,所以就随记忆写一些开发过程中遇到的一些问题吧,写的不好,给自己看的没关系。
1.权重。这个问题困绕了好久,后来发现绕弯路了,查找关于dotLucene的权重问题,看到最多的就是这个例子了了。
比如对公司内很多的邮件做了索引,你当然希望主要查看和公司有关的邮件,而不是员工的个人邮件.这点根据邮件的地址就可以做出判断比如包含@alphatom.com的就是公司邮件,而@gmail.com等等就是私人邮件.如何提高相应邮件的权重? 代码如下:
public static String COMPANY_DOMAIN = "alphatom.com";
Document doc = new Document();
String senderEmail = GetSenderEmail();
String senderName = getSenderName();
String subject = GetSubject();
String body = GetBody();
doc.Add(Field.Keyword("senderEmail”, senderEmail));
doc.Add(Field.Text("senderName", senderName));
doc.Add(Field.Text("subject", subject));
doc.Add(Field.UnStored("body", body));
if (GetSenderDomain().EndsWith(COMPANY_DOMAIN))
//如果是公司邮件,提高权重,默认权重是1.0
doc.SetBoost(1.5);
else //如果是私人邮件,降低权重.
doc.SetBoost(0.1);
writer.AddDocument(doc);
不仅如此你还可以对Field也设置权重.比如你对邮件的主题更感兴趣.就可以提高它的权重.
当时也用这个方法在web页面里设置来着,可写到doc.Add(Field.Keyword("senderEmail”, senderEmail))时候发现,Field的根本就没有Keyword、Text、UnStored属性,蒙了,试来试去才知道,原来这个是要写到一个console应用程序中去的,而且找不到Field的属性是因为没有引用Lucene.Net.dll,呵呵问题解决了,在console生成索引之前就给你想要提前排名的doc设置权重,这样就能直接把有特殊记号的doc包括它修改后的权重一起添加到索引中去,为日后按权重取索引提供了方便。搜索结果的时候就不必在考虑权重设置的问题了。
2.asp页面与asp.net页面跳转。一开始把这个问题给妖魔化了,因为从未做过不同语言、平台结合到一起的事情,后来经自己测试和同事指点不怕不怕,就把dotLucene项目直接放进之前建好的asp项目中就可以啦,而跳转呢,则是用了一个submit按钮来实现,当然要传到.aspx页面的参数(包括关键字、提交按钮还有分类id)都要包含在一个<form method="get" action="../dotLucene/Search.aspx" ID="Form1">……</form>中。还有就是dotLucene中有一个叫index(或其他名字).html文件,不要小看这个文件(偶一开始就小看了,不是小看而是根本没看到),打开里边的源文件,注意里边form中的action,必须要指到那个真正完成搜索的页面,如偶项目中的Search.aspx。<form method="get" action="Search.aspx" ID="Form1">
<P align="center"><input name="q" id="q" type="text" Width="211px" size="32"> <input type="submit" value="Search"></P>
</form>
3.asp页面通过url给.net页面传递参数。关于asp的知识本人可以说是一窍不通,还有基础知识也是烂的可以,好多事情言传不出来,只是知道要这么做才行(需恶补基础)。关于这个参数问题,可是缠了许久,脑子也糊了许久,用.net一般的传参方式不行,如<a href="/news/index.asp?id=1"></a>,asp页面传到.aspx页面后参数就没啦,后来放了个隐藏域,<input type="hidden" id="id" name="id" value="<%=request("id")%>"/>,就能取到参数了,并且传给.aspx页面了。
对了,还有好心大叔给了偶这个http://www.baidu.com/search/freecode.html,更简单,百度的,只要把这个贴到你的网站中就可以让百度来给你实现站内/外的搜索啦。没好好调试,有中文乱码问题待解决。
小女子出次写开发心得,写的不好,请见者见量。