HubbleDotNet 검색엔진의 인덱스 데이터가 미비한 문제 해결

13416 단어 검색 엔진
Hubble Dotnet은 국산입니다.NET 플랫폼 검색엔진의 대표적인 특징은 원본 코드를 개방하고 사용이 편리하지만 저는 비생산 환경에서 사용해 왔습니다.공식 홈페이지는 HubbleDotNet 오픈 소스 전체 텍스트 검색 데이터베이스 프로젝트 - 기술 상세 정보에 있습니다.
이전에는 데이터베이스에서 Mysql을 사용할 때는 문제가 없었지만 MonogoDB를 데이터 원본으로 사용한 후에는 데이터가 모두 자동으로 인덱스되지 않는 경우가 많았다.예를 들어 10W의 표가 있으면 종종 3W까지만 인덱스할 수 있고 심지어는 매번 인덱스의 수량도 다르다.
이 일은 나를 오랫동안 끌었다. 만부득이하게 로그 소스 코드를 보고서야 프로그램의 버그를 발견했다.
시스템 로깅은 다음과 같습니다.
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가 없는 경우도 있어.필드.Hubble Dotnet이 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

분명히 내가 Journal Name에 저장한 것은 NVarchar 필드인데 여기서 반드시 내가 필요로 하는 유형이 Double이고 시스템 뇌졸중인지 알려야 한다. 이것도Mongo Adapter의 매핑이 잘 되지 않았다. 다행히 이런 상황은 전체 데이터에 집중적으로 나타나는 횟수가 매우 적다. 나는Try-Catch를 더해서 로그 로그를 출력하여 이 문제를 해결했다(O(%) O~).
상기 두 가지 문제가 해결된 후에 검색엔진은 모든 데이터를 정확하게 검색할 수 있어서 매우 기쁘다.
좋은 글은 남의 문제를 해결하는 것도 좋다. 해결 방법이 그렇게 우아하지는 않지만, Hubble은 지금도 쓸모가 있는가?묵묵히 숨었다.

좋은 웹페이지 즐겨찾기