gpt4 book ai didi

c# - lucene.net 3.0.3 索引空间太慢

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:06 25 4
gpt4 key购买 nike

我最近将我的搜索代码从 lucene.net 2.9.4 升级到 3.0.3。我注意到空间包发生了变化,并相应地更新了我的代码。我注意到升级的一个缺点是索引时间慢得多。通过消除过程,我已经能够将缓慢缩小到索引纬度/经度坐标的新空间代码:

        public void AddLocation (double lat, double lng)
{
try
{
string latLongKey = lat.ToString() + "," + lng.ToString();
AbstractField[] shapeFields = null;
Shape shape = null;
if (HasSpatialShapes(latLongKey))
{
shape = SpatialShapes[latLongKey];
}
else
{
if (this.Strategy is BBoxStrategy)
{
shape = Context.MakeRectangle(DistanceUtils.NormLonDEG(lng), DistanceUtils.NormLonDEG(lng), DistanceUtils.NormLatDEG(lat), DistanceUtils.NormLatDEG(lat));
}
else
{
shape = Context.MakePoint(DistanceUtils.NormLonDEG(lng), DistanceUtils.NormLatDEG(lat));
}

AddSpatialShapes(latLongKey, shape);
}

shapeFields = Strategy.CreateIndexableFields(shape);
//Potentially more than one shape in this field is supported by some
// strategies; see the javadocs of the SpatialStrategy impl to see.
foreach (AbstractField f in shapeFields)
{
_document.Add(f);
}
//add lat long values to index too
_document.Add(GetField("latitude", NumericUtils.DoubleToPrefixCoded(lat), Field.Index.NOT_ANALYZED, Field.Store.YES, 0f, false));
_document.Add(GetField("longitude", NumericUtils.DoubleToPrefixCoded(lng), Field.Index.NOT_ANALYZED, Field.Store.YES, 0f, false));
}
catch (Exception e)
{
RollingFileLogger.Instance.LogException(ServiceConstants.SERVICE_INDEXER_CONST, "Document",string.Format("AddLocation({0},{1})", lat.ToString(), lng.ToString()), e, null);
throw e;
}
}

在 2.9.4 中,我能够在大约 11 分钟内用 lat/lng 点索引大约 300,000 行数据。使用这个新的空间包需要超过 5 个小时(我在测试完成之前就终止了测试,所以我没有确切的时间)。这是我正在使用的空间上下文/策略:

   public static SpatialContext SpatialContext
{
get
{
if (null == _spatialContext)
{
lock (_lockObject)
{
if(null==_spatialContext) _spatialContext = SpatialContext.GEO;
}
}
return _spatialContext;
}
}

public static SpatialStrategy SpatialStrategy
{
get
{
if (null == _spatialStrategy)
{
lock (_lockObject)
{
if (null == _spatialStrategy)
{
int maxLength = 9;
GeohashPrefixTree geohashPrefixTree = new GeohashPrefixTree(SpatialContext, maxLength);
_spatialStrategy = new RecursivePrefixTreeStrategy(geohashPrefixTree, "geoField");
}
}
}
return _spatialStrategy;
}
}

我的索引方法有什么问题吗?我已经缓存了由 lat/lng 点创建的形状,因为我不需要相同坐标的新形状。似乎是 CreateIndexableFields() 方法在索引期间花费的时间最多。我试图缓存此方法生成的字段以重用,但我无法从缓存字段创建 TokenStream 的新实例以用于新文档(在 lucene.net 3.0.3 中,TokenStream 的构造函数 protected ).我已经在空间策略中将 maxLevels int 降低到 4,但我没有看到索引时间的改善。任何反馈将不胜感激。

最佳答案

更新:我将 SpatialStrategy 更改为 PointVectorStrategy,现在我对大约 300,000 个文档的索引时间已回落到 11 分钟。这样做的关键是缓存由形状创建的 IndexableFields,以便在添加到文档时使用。 PointVectorStrategy 允许这样做,因为它为索引创建了 NumericFields。这对于 RecursiveTreePrefixStrategy 是不可能的,因为它使用 TokenStreams 创建字段以进行索引。在 Lucene.net 3.0.3 中,TokenStreams 不可重复用于索引。感谢大家对此的帮助。

关于c# - lucene.net 3.0.3 索引空间太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com