python whoosh花太长时间无法索引大文件

时间:2019-02-22 08:33:13

标签: 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()

我不确定这是否是正确/最快的索引数据的方法。更改架构会使索引编制更快吗?如果不是,在这样的大文件上使用whoosh或其他索引库的一般想法是否是一个好主意?

好处是,索引只会执行一次,所以我愿意等待,如果这样可以缩短搜索时间。我没有全文搜索经验。有人会知道,通过我的设置,编制索引需要多长时间?

这是我的csv示例:

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

2 个答案:

答案 0 :(得分:1)

我在这里分享了此确切问题的官方文档页面的一部分(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()

答案 1 :(得分:0)

您的方法很好。全文搜索的权衡是,您将快速查询换为慢速索引编制,因此您需要尽可能多地进行前期工作。

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

如果您打算多次查询该索引,那么时间上的投资可能是值得的,并且您的查询应该相当快。如果您需要频繁索引大型文件并且每次都不能等待5个小时,则可以考虑改用Lucene,Solr或Elasticsearch。

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

仅在需要评分和NLP功能(例如词干和断词)时才真正需要全文搜索。