解决HubbleDotNet搜索引擎索引数据不全的问题

   HubbleDotnet是国产.NET平台搜索引擎的翘楚,开放源代码,使用方便,不过我一直在非生产环境下使用。官方网页在HubbleDotNet开源全文搜索数据库项目--技术详解.

      以前当数据库使用Mysql的时候没问题,但当使用了MonogoDB做数据源之后,经常出现数据无法全部自动索引的情况。比如有10W的表,常常只能索引到3W甚至更少,乃至每次索引的数量都不同。

  这件事拖了我很久,万不得已看日志查源代码,才发现是一个程序上的bug.

  系统日志记录如下:

LogTime:2015-01-06 16:43:32.773
Process:HubbleTask
Message:ErrMsg:Get documents for insert fail!
Exception:System.ArgumentException
Message:列“Year”不属于表 Table1。
Stack:   在 System.Data.DataRow.GetDataColumn(String columnName)
   在 System.Data.DataRow.get_Item(String columnName)
   在 Hubble.Core.Service.SynchronizeCanUpdate.GetOneRowDocument(DataRow row) 位置 d:\Codes\C#\OpenSources\hubbledotnet-100319\C#\src\Hubble.Data\Hubble.Core\Service\SynchronizeCanUpdate.cs:行号 300
   在 Hubble.Core.Service.SynchronizeCanUpdate.GetDocumentsForInsert(IDBAdapter dbAdapter, Int64& from) 位置 d:\Codes\C#\OpenSources\hubbledotnet-100319\C#\src\Hubble.Data\Hubble.Core\Service\SynchronizeCanUpdate.cs:行号 471
   在 Hubble.Core.Service.SynchronizeCanUpdate.DoGetDocumentsForInsertAsync(Object dbAdapter) 位置 d:\Codes\C#\OpenSources\hubbledotnet-100319\C#\src\Hubble.Data\Hubble.Core\Service\SynchronizeCanUpdate.cs:行号 425

    找到对应的源代码,SynchronizeCanUpdate.cs,位置如下:

foreach (Field field in _DBProvider.Table.Fields)
            {
                if (field.IndexType == Field.Index.None)
                {
                    if (!_DBProvider.Table.HasMirrorTable)
                    {
                        continue;
                    }
                }

                string value = null;

                if (row[field.Name] == DBNull.Value)  //此处出错
                {
                    if (!field.CanNull)
                    {
                        throw new DataException(string.Format("Field:{0} in table {1} is not null so that it can't be inserted null value!",
                            field.Name, _DBProvider.Table.Name));
                    }

                    if (field.DefaultValue == null)
                    {
                        if (field.IndexType != Field.Index.None)
                        {
                            throw new DataException(string.Format("Field:{0} in table {1} is null but hasn't default value so that it can't be inserted null value!",
                                field.Name, _DBProvider.Table.Name));
                        }
                    }

                    value = field.DefaultValue;
                }
                else
                {
                    if (row[field.Name] is DateTime)
                    {
                        value = ((DateTime)row[field.Name]).ToString("yyyy-MM-dd HH:mm:ss.fff");
                    }
                    else
                    {
                        value = row[field.Name].ToString();
                    }
                }

                document.Add(field.Name, value, field.DataType, field.DataLength, false);
            }

      很清楚,DataRow中,没有Year这个字段。但是我在建立索引 表的时候,是添加了一个可空字段Year的啊,更何况,其他条数据的索引都没问题,但就会遇到一些数据Row没有Year. 字段。可能是HubbleDotnet对MongoDb的驱动支持不够完善吧,在中间的转换出了问题,改进也很简单:

foreach (Field field in _DBProvider.Table.Fields)
            {
                if (field.IndexType == Field.Index.None)
                {
                    if (!_DBProvider.Table.HasMirrorTable)
                    {
                        continue;
                    }
                }

                string value = null;

                object v = DBNull.Value;
                try
                {
                    if (row.Table.Columns.Contains(field.Name))  //此处判断是否拥有该字段
                    {
                        v = row[field.Name];

                    }
                }
                catch (Exception ex)
                {

                    Global.Report.WriteErrorLog(string.Format("this is a null value, collum {0} not in the table",field.Name));
                }

                if (v == DBNull.Value)
                {
                    if (!field.CanNull)
                    {
                        throw new DataException(string.Format("Field:{0} in table {1} is not null so that it can't be inserted null value!",
                            field.Name, _DBProvider.Table.Name));
                    }

                    if (field.DefaultValue == null)
                    {
                        if (field.IndexType != Field.Index.None)
                        {
                            throw new DataException(string.Format("Field:{0} in table {1} is null but hasn't default value so that it can't be inserted null value!",
                                field.Name, _DBProvider.Table.Name));
                        }
                    }

                    value = field.DefaultValue;
                }
                else
                {
                    if (v is DateTime)
                    {
                        value = ((DateTime)v).ToString("yyyy-MM-dd HH:mm:ss.fff");
                    }
                    else
                    {
                        value = v.ToString();
                    }
                }

                document.Add(field.Name, value, field.DataType, field.DataLength, false);
            }

另外的问题如下:

LogTime:2015-01-06 17:52:34.389
Process:HubbleTask
Message:System.ArgumentException: 输入字符串的格式不正确。不能在 JournalName 列中存储 <research in microelectronics and electronics, 2005 phd>。所需类型是 Double。 ---> System.FormatException: 输入字符串的格式不正确。
   在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
   在 System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
   在 System.String.System.IConvertible.ToDouble(IFormatProvider provider)
   在 System.Data.Common.DoubleStorage.Set(Int32 record, Object value)
   在 System.Data.DataColumn.set_Item(Int32 record, Object value)
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.Data.DataColumn.set_Item(Int32 record, Object value)
   在 System.Data.DataRow.set_Item(DataColumn column, Object value)
   在 Hubble.Core.DBAdapter.MongoAdapter.QuerySql(String sql) 位置 d:\Code\OpenSource\hubbledotnet-100319\C#\src\Hubble.Data\Hubble.Core\DBAdapter\MongoAdapter.cs:行号 1081

    明明我在JournalName 存储的是一个NVarchar字段,此处却一定要提示我所需类型是double,系统脑抽么,这也是MongoAdapter的映射没做好,好在这种情况在整个数据集中出现的次数很少,我加上Try-Catch,输出了Log日志,解决了这个问题(O(∩_∩)O~)。

  以上两个问题解决之后,搜索引擎可以正确检索全部数据了,好开心。

  好水的文章,能解决别人的问题也是好的,虽然解决方法没那么优雅,而且Hubble现在还有人用么?默默的匿了。

时间: 2025-01-03 07:34:02

解决HubbleDotNet搜索引擎索引数据不全的问题的相关文章

百度lee:搜索引擎索引系统概述(一)

从上次8月份百度站长平台lee发布关于搜索引擎抓取信息后2个月已经过去,这次lee继续发布了搜索引擎索引系统的信息.不管怎么样,木木SEO认为百度官方的公告我们还是要了解和分析的.下面是百度官方公告: 众所周知,搜索引擎的主要工作过程包括:抓取.存储.页面分析.索引.检索等几个主要过程.过去几周给大家介绍了抓取相关的简要过程.今天简要介绍一下索引系统,以亿为单位的网页库中查找特定的某些关键词犹如大海里面捞针,也许一定的时间内可以完成查找,但是用户等不起,从用户体验角度我们必须在毫秒级别给予用户满

解决Word中字体显示不全的技巧

  用Word时,有时候会出现字文字不全或者是显示一半的情况.这种情况让很多的用户不知所措,怎么搞都没办法恢复.其实是大家没有掌握技巧,接下来就跟小编一起来仔细了解一下吧! Word 故障分析:一般出现这种故障,要么就是我们负责别人的内容到word里面导致文字信息显示不全,要么就是通过别的电脑打开你的文档出现文字无法显示的情况.导致该故障的原因就包括首先可能是你的word办公软件的字体库数据不全,其次就是我们排版除了问题所导致. 故障解决:word字体库字体不全,所以打开word文档之后,就认不

如何解决mysql查询百万数据时出现大量sleep的进程

问题描述 如何解决mysql查询百万数据时出现大量sleep的进程 如何解决mysql查询百万数据时出现大量sleep的进程: 当使用jdbc 查询数据量为100多万的数据时,mysql会出现大量sleep的进程,然后程序便会卡死在那儿 解决方案 描述的有点泛泛,如果能把使用场景.涉及库表定义发一下会更容易分析. 大量sleep进程可能并不是问题,因为如果使用到连接池的话,一开始就是初始化一些连接,这些连接没有使用的话,在mysql看可能就是sleep的. 从你描述,感觉"查询数据量为100多万

oledbdataadapter.fill 读取的数据不全

问题描述 oledbdataadapter.fill 读取的数据不全 为什么我从exl 文件中读取 的时候 如果 某一个单元格的字数太多 那么dataset里的数据就不全 总是别截取掉 为什么呢 string connstring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"; OleD

关于httpclient用法, post提交,抓取数据不全

问题描述 请教下面纠结的问题: 我用httpclient,post提交参数,抓取指定检索到的的数据(分多个页面,一个页面一次提交请求),大部分抓取的数据都是全的,大概抓取了100左右页面数据,就开始有一页面的数据不全,断断续续,不全的数据是:没有我指定参数提交的检索到的数据(只有静态页面的数据,即:没有业务数据),但是请求返回来的状态是200,也获取不到异常,纠结了好几天;代码:public String clientPost(String urll, String htmlbody) {Str

解决网站搜索引擎收录少的问题

解决网站搜索引擎收录少的问题 如果想让网站在搜索引擎上获得更多的流量,我们首先需要解决的问题就是如何让搜索引擎收录更多的网站页面,思亿欧的免费SEO咨询服务经常会接到一些关于如何提高网站的搜索引擎收录量之类的问题. 一个网站的搜索引擎收录量的高低,确实可以反应出网站现存在的一些不利于SEO的因素,这些就是阻碍网站在搜索引擎上表现更好的因素. 对于如何提高网站的搜索引擎收录量,杭州思亿欧的搜索引擎优化团队对www.111cn.net的操作,我们建议从三处地方入手,对网站加以改善: 1.链接: 内部

知己知彼之搜索引擎索引过程

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 这是天刃在"网站推广&SEO"群里针对一些站长对蜘蛛多次检索自己的网站却一直不收录,以及自己网站日志中发现有多个蜘蛛爬自己的站的问题,做的一些详细解答.经天刃同意我把其中的内容整理后发布,呵呵,应该也算原创啊! 搜索引擎的蜘蛛抓取页面的一般过程是这样的. 首先,收集待索引网页的url. 搜索引擎的蜘蛛一般分为两类,

外链的起起浮浮是源于搜索引擎的数据删除

前几天百度大更新,许多网站收录和外链成倍增加.但昨天晚上有人在群里聊天说外链大降了,问我这是怎么回事,这刚升上来的外链,怎么会这么快又降下去了呢?真是令人不解啊,我问他你网站的关键词排名有没有下降呢?他说这倒没有,既然没影响,外链下降了就没什么值得大惊小怪的.可是人家硬是不放心,追问我这具体是怎么一回事?当时我也跟它解释了一下其中的缘由,我想可能大家心中也有类似的疑问,今天笔者就为你揭开这神秘的面纱吧. 其实外链也是有生命周期的,就像任何一个生物一样,有生就有死.本来没什么奇怪的,当然这个答案交

解决mysql导入导出数据乱码问题

  最近在linux上面用mysqldump导出数据,放在windows系统中导入就会出现中文乱码,然后就会导致出现: Unknown MySQL server host和Can't connect to the server的错误. 解决mysql导入导出数据乱码问题就是统一导入导出的编码,linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--