我在Sqlite表中有一本书,每行有一个句子。有超过30k行/句子,这个表的格式不能改变(它会破坏太多其他东西)。
我还有几个不同的ID范围,或多或少将书分成段落。它们在列表中的元组中,即[(0,2),(3,6),(7,10)......]或[(0,3),(4,9),(10,13) ......]等等。
我需要能够返回包含两个或更多单词的跨度。也就是说,在相同的范围/段落中找到“水”和“地球”。
我考虑使用GROUP_CONCANT组合句子来使用每组跨度制作视图,但由于无法追加视图,因此无法做到这一点。
进行1000次选择调用,例如'SELECT * IN book WHERE ID BETWEEN?和?和...'似乎效率不高。
有没有办法返回具有单个语句命中的跨度,或者某种方式使用临时表来组合它们?
答案 0 :(得分:1)
如果它们是顺序的(或者您可以强制按ID排序以与您的跨度相关联),那么您可以使用Python通过向每个组应用任意键来进行分组,然后将其用作一部分通过...分组。例如:
from itertools import repeat, izip, chain, groupby
from operator import itemgetter
testdata = [str(i) for i in range(10)]
spans = [(0,2), (3,6), (7,10)]
groups = chain.from_iterable(repeat(idx, e - s + 1) for idx, (s, e) in enumerate(spans))
for k, g in groupby(izip(testdata, groups), itemgetter(1)):
words = set(chain.from_iterable(el[0].split() for el in g))
if words.issuperset(['3', '6']):
print words
你需要修改它如何分割单词并选择匹配的内容,但它仍然是一种可能的选择。
如果您经常这样做,您可能希望考虑创建一个额外的表,其中包含代表段落的单个列(而不是句子),并在该列上应用full text index,这将使将来的查询成为很容易。您可以使用上面的代码来帮助构建该表。