当前位置: 首页 > 工具软件 > HubbleDotNet > 使用案例 >

hubbledotnet 使用过程中遇到的问题

阙奇思
2023-12-01

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,在更新索引的时候,可以根据条件更新,但最好别更新主键,否则有可能引起索引混乱(当满足条件的数据不止一条的时候,要更新的主键就会混乱)

 

 类似资料: