近期项目中遇到的问题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不会去处理
有的时候,可能不需要或者不能使用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不会去处理