近期项目中遇到的问题Lucene.NET、MonoRail

1.Lucene.NET返回查询集合
有的时候,可能不需要或者不能使用hits.Doc(i).Get("ID")读取数据,此时,可以返回一个集合。

Hits hits = null;
//……省略BooleanQuery那个代码
//orderValue排序,reverse正倒序
hits = iSearch.Search(bq, new Sort(new SortField(orderValue, SortField.DOC,reverse)));

//得到HitIterator对象,继承IEnumerator接口,位于Lucene.Net.Search下
HitIterator iters = hits.Iterator();

其中的方法
public virtual object Current { get; }   //当前Hit
public virtual int Length();             //集合长度
public virtual bool MoveNext();          //是否移动到下一个Hit
具体内容可以下载源码查看


可以直接使用
String ids = "";
for (int i = 0; i < iters.Items; i++)
{
    if (iters.MoveNext())
    {
        Hit h = hits.Current as Hit;
        if (classIds.Contains(h.Get("ID")))
            continue;
        ids += h.Get("ID") + ",";
    }
    else
        break;
}

亦可放到一个List<Object>中使用(项目使用的MonoRail,因此主要是使用的这个方法)
List<Object> tempHit = new List<Object>();
for (int i = 0; i < this.Hit.Length(); i++)                   //循环HitIterator集合
{
    //判断HitIterator集合是否结束
    if (this.Hit.MoveNext() && index <= 1000)
    {
        tempHit.Add(this.Hit.Current);
    }
    else
        break;
}

这样做的好处一是MonoRail前台比较方便调用,二是对于一个站点有多个搜索,比如新闻和商城,前台调用一个方法即可。


2.MonoRail的URL传中文问题

自己建一个测试项目,直接在地址栏中输入:http://localhost/home/test.aspx?key=测试

放在IIS下,重写URL去掉home,http://localhost/test.aspx?key=测试

网页将输出乱码,不管你加了<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />或者nvelocity.properties都没用

原因正是MonoRail的routing,具体源码没有去查

因为是需要AJAX的时候传递一下中文,因为只是修改了一下routing的正则,改为/so/([^home])(.*),这样,带有home的地址如 http://localhost/home/test.aspx?key=测试,将不会通过正则,MonoRail不会去处理


你可能感兴趣的:(Lucene)