python嗖嗖声太长,无法索引大文件

python嗖嗖声太长,无法索引大文件,python,csv,indexing,full-text-search,whoosh,Python,Csv,Indexing,Full Text Search,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

我有一个约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)相比,Whoosh索引速度非常慢。从我的电脑上的一些快速测试来看,它每秒索引540行左右。大约4.5到5小时内,您可以预期有900万行索引。您添加的字段越多,尤其是要分析的字段,所需的时间就越长,因此请确保只分析必要的字段,并只为需要的字段编制索引

如果您计划多次查询此索引,那么在时间上的投资是值得的,并且您的查询应该相当快。如果需要频繁地对大文件进行索引,并且不能每次等待5小时,那么考虑切换到Lucene、SoR或ErructSurviv.

你的数据看起来也很简单。如果精确的布尔查询足够,熊猫查询可以让您更快地搜索数据帧。Pandas为基本文本处理提供了快速矢量化方法,您可以使用这些方法进行诸如小写、停止字删除、字符映射和正则表达式等操作


如果您需要评分和NLP功能,如词干分析和分词,您才真正需要全文搜索。

我在这里分享正式文档页的一部分,以了解这一问题()。请参阅链接了解其他方法,如增加核心数量

增加
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()

下面的答案回答了你的问题吗?