HubbleDotNet 검색엔진의 인덱스 데이터가 미비한 문제 해결
13416 단어 검색 엔진
이전에는 데이터베이스에서 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은 지금도 쓸모가 있는가?묵묵히 숨었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
elasticsearchnested 삽입 대상 전체 텍스트 검색 및 정렬ES Nested 중첩 유형은 무엇입니까?Elasticsearch에는 다음과 같은 다양한 데이터 유형이 있습니다. 기본 데이터 형식:string 형식.ES 7.x에서string 형식은:text와 키워드로 업그레이드됩...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.