2013-05-22 60 views
0

我在Sqlite表中有一本書,每行有一個句子。有超過30k行/句子,這個表的格式不能改變(它會打破太多其他的東西)。Python Sqlite - 只選擇多行的行數

我也有幾個不同的身份證跨度,這些身份證或多或少地將書本分成段落。它們在列表中的元組中,即[(0,2),(3,6),(7,10)...]或[(0,3),(4,9),(10,13) ...]等

我需要能夠返回包含兩個單詞或更多的跨度。也就是說,在相同的跨度/段落內找到一起說「水」和「地球」。

我看着使用GROUP_CONCANT組合句子來製作視圖,但是由於無法附加視圖,所以無法找到它。

製作1000個選擇調用,如'SELECT * IN book WHERE ID BETWEEN?和? AND ...'看起來效率不高。

有沒有辦法使用單個語句返回具有命中的跨度,或者可能使用臨時表來組合它們的某種方式?

回答

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,這將使未來的查詢變得更容易。你可以利用上面的代碼來幫助建立表格。

+0

謝謝。讓我稍微處理一下,然後我會回來。關於用段落添加新表格,我想避免這種情況,因爲它會大大增加每個段落表格的數據庫大小。添加5個表格後,數據庫將會增大5倍。 – Tim

+0

@Tim在應用FTI時會比五倍大。儘管你面臨這種折衷。 –