HubbleDotNet是一个全文搜索框架,在dotnet领域有一些人在使用,毕竟不像sqlserver那样成熟,也没有非常系统的说明文档,在使用中会遇到一些神奇的问题。下面我总结一下我在工作中遇到的问题,以便以后使用过程中,不再犯相同的错误。我是通过程序维护的索引
问题1:有时候根据id删除了索引,但查询的时候,多表联查依然可以查询到删除掉的id,只不过内容都是空的,但根据id在单表中又差不多,看似是索引乱了,才是,通过query analyzer重新rebuild索引就可以了,不过下次删除,索引又乱了。
这个问题困扰了我好久,最好在查看博客园里作者的说明文档的时候才明白,是自己删除的时候顺序错了。插入的时候,先插入数据库,在插入索引,更新的时候顺序貌似没关系,不过删除掉时候,需要先删除索引,再删数据库。具体原理,也没弄清楚。(http://www.cnblogs.com/eaglet/archive/2010/07/09/1774080.html)
问题2:有时候需要排序,但我选择不同的字段后,查询到总数居然不一致,按照score排序应该是对的,但按照一些别的int类型或者datetime型的数据量就少一些
同样困扰了我很久,最后的解决办法是在orderby后面加上score,
Eg:select * from news order by createdate desc,score desc
这样,查询总数就可以保持一致。
问题3:有时候分页的时候,明明到了最后一页,却还能点下一页,不是分页的问题,而是查询后数据总数又变了
看别人是这样做的,直接上代码
[unionselect] [distinct(‘uid’)] select between 0 to 9 id from users
[distinct(‘nid’)] select between 0 to 9 id from news
就是在每个查询到语句前面加上[distinct(‘pk’)],pk是你建索引的主键
问题4:给hubbledotnet设置主键
Hubbledotnet貌似支持联合主键,不过,我在视图里建好了一个自增的id,用它来作为hubbledotnet中的主键,因为hubble中主键只支持int类型(可能有误)
问题5:当查询到关键字在指定的字符串中查询不到的时候(也就是做高亮显示的时候),分词查询到的结果为空
此时需要做判断,如果为空,则取以前的字符串
Eg:public static string AddLight(stringoldData, string keyword)//对?结¨¢果?加¨®高?亮¢¨¢
{
stringnewStr =null;
if(!string.IsNullOrEmpty(oldData))
{
oldData = HttpUtility.HtmlEncode(oldData);
Highlighterhighlighter =new Highlighter(hbIndexFormatter,new PanGuAnalyzer());
highlighter.FragmentSize= string.IsNullOrEmpty(oldData) ? 100 : oldData.Length;
//highlighter.FragmentSize =100;
newStr =highlighter.GetBestFragment(keyword.Trim(), oldData.Trim());
if(string.IsNullOrEmpty(newStr)) //如果为空,则取以前的字符串 {
newStr = oldData;
}
}
returnnewStr;
}
问题6,使用hubble时候,有点字段,例如用户名,来源于用户表,而我们建立的索引是以news表或者news表的视图。当我们更新用户名的时候,还需要更新索引,否则,查询出来的用户名是以前的用户名。
问题7,当在一个较长的字符串中查询关键词的时候,设置highlighter.FragmentSize
时,可以把它设置为该字符串的长度,这样该字符串就会全部显示,否则只显示你设置的长度的字符串
问题8,在更新索引的时候,可以根据条件更新,但最好别更新主键,否则有可能引起索引混乱(当满足条件的数据不止一条的时候,要更新的主键就会混乱)