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


慕容森
浏览 268回答 2
2回答

守着一只汪

你的方法没问题。与全文搜索的权衡是您用快速查询换取慢速索引,因此您可以预先完成尽可能多的工作。与 Lucene 及其生态系统(Solr、Elasticsearch)相比,Whoosh 索引非常慢。从我的 PC 上的一些快速测试来看,它每秒索引大约 540 行。您可以在大约 4.5 到 5 小时内索引 900 万行。添加的字段越多,尤其是要分析的字段,所需的时间就越长,因此请确保仅分析必要的字段并仅索引所需的字段。如果您计划多次查询此索引,那么在时间上的投资是值得的,并且您的查询应该相当快。如果你需要经常索引大文件,而且每次都等不及 5 个小时,那么可以考虑切换到 Lucene、Solr 或 Elasticsearch。您的数据似乎也很简单。如果精确的布尔查询就足够了,Pandas 查询允许您更快地搜索 DataFrame。Pandas 提供了用于基本文本处理的快速矢量化方法,您可以将其用于诸如小写、停用词移除、字符映射和正则表达式之类的事情。如果您需要评分和 NLP 工具(例如词干提取和分词),您才真正需要全文搜索。

潇湘沐

我在这里分享了这个确切问题的官方文档页面的一部分(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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python