python whoosh 索引大文件的时间太长

use*_*538 2 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 = 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()
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是索引数据的正确/最快方法。更改架构是否会使索引更快?如果不是,使用 whoosh 或其他索引库的一般想法是否适合像这样的大文件?

好消息是索引只会做一次,所以我愿意等待这是否会提供快速的搜索时间。我在全文搜索方面没有经验。有人会知道,通过我的设置,索引需要多长时间?

这是我的 csv 示例:

ID,TYPE,TEXT,ID2
1058895,1,Be,1067806
1058895,2,Hosl,101938
1058895,3,370,None
1058895,4,Tnwg,10582
Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 5

你的方法没问题。与全文搜索的权衡是,您将快速查询换成慢速索引,因此您可以预先完成尽可能多的工作。

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

如果您计划多次查询此索引,那么在时间上的投资是值得的,并且您的查询应该相当快。如果你需要经常索引大文件,而且每次都等不及 5 个小时,那么可以考虑切换到 Lucene、Solr 或 Elasticsearch。

您的数据似乎也很简单。如果精确的布尔查询就足够了,Pandas 查询允许您更快地搜索 DataFrame。Pandas 提供了用于基本文本处理的快速矢量化方法,您可以将其用于诸如小写、停用词移除、字符映射和正则表达式之类的事情。

如果您需要评分和 NLP 工具(例如词干提取和分词),您才真正需要全文搜索。