我有一个约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
答案 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功能(例如词干和断词)时才真正需要全文搜索。