Python Whoosh花了太长时间来索引一个大文件



我有一个约900万行的CSV文件。我希望能够快速从此文件中搜索一行。我决定使用python whoosh索引这些数据,然后像下面的那样搜索它。

schema = Schema(content=TEXT(stored=True, analyzer=RegexTokenizer() | LowercaseFilter() | CharsetFilter(accent_map)))
if not os.path.exists("index"):
    os.mkdir("index")
ix = create_in("index", schema)
ix = open_dir("index")
writer = ix.writer()
with open(file_path, 'r', encoding='utf-8') as file:
    for line in file:
        writer.add_document(content=line)
writer.commit()

我不确定这是否是索引数据的正确/最快方法。更改模式会更快地索引吗?如果没有,使用Whoosh或其他索引库的一般想法是这样的大型文件大小的好库?

好处是,索引只能完成一次,所以我愿意等待这是否会提供快速搜索时间。我没有在全文搜索中经验丰富。有人会在我的设置中知道索引需要多长时间吗?

这是我的CSV的样本:

ID,TYPE,TEXT,ID2
1058895,1,Be,1067806
1058895,2,Hosl,101938
1058895,3,370,None
1058895,4,Tnwg,10582

您的方法很好。全文搜索的权衡是,您将快速查询交易以进行缓慢的索引,因此您可以尽可能多地进行工作。

与Lucene及其生态系统(Solr,Elasticsearch)相比,索引非常慢。通过在我的PC上进行一些快速测试,它每秒索引约540行。您可以预期在约4.5到5个小时内将900万行索引。您添加的字段越多,尤其是将要分析的字段,它将需要的时间越长,因此请确保仅分析必要的字段并仅索引所需的字段。

如果您打算多次查询此索引,那么时间的投资可能值得,并且您的查询应该很快。如果您需要经常索引大文件并且每次都无法等待5个小时,请考虑切换到Lucene,Solr或Elasticsearch。

您的数据似乎也很简单。如果确切的布尔查询足够,熊猫查询使您可以更快地搜索数据框架。PANDA提供了快速的矢量化方法,用于基本文本处理,您可以将其用于诸如下调,停止词删除,角色映射和正则表达式之类的东西。

如果您需要评分和NLP设施,例如Stegming和Word Breaking。

,您才真正需要全文搜索

我在此处共享一个正式文档页面,以解决此确切问题(https://whoosh.readthedocs.io/en/latest/batch.html)。有关增加核心数量的其他方法,请参见链接。

增加whoosh索引器的RAM内存量。默认情况下仅设置为128 MB:

    from whoosh import index
    ix = index.open_dir("indexdir")
    writer = ix.writer(limitmb=2048)

允许分析仪的更多缓存,否则可以大大减慢索引。

    w = myindex.writer()
    # Get the analyzer object from a text field
    stem_ana = w.schema["content"].format.analyzer
    # Set the cachesize to -1 to indicate unbounded caching
    stem_ana.cachesize = -1
    # Reset the analyzer to pick up the changed attribute
    stem_ana.clear()

相关内容

最新更新