2013-05-22 2 views
0

Sqlite 테이블에 행당 한 문장의 책이 있습니다. 30KB가 넘는 행/문장이 있으며이 표의 형식을 변경할 수 없습니다 (다른 항목이 너무 많이 손상 될 수 있음).Python Sqlite - 여러 단어가있는 행만 선택하십시오.

나는 또한 책을 단락으로 나누는 몇 가지 다른 ID가 있습니다. 그들은 [(0,2), (3,6), (7,10) ...] 또는 [(0,3), (4,9), (10,13)) 목록의 튜플에 있습니다. ...] 등

두 단어 이상을 포함하는 범위를 반환 할 수 있어야합니다. 즉, 동일한 span/paragraph 내에서 "물"과 "지구"를 함께 찾는다.

GROUP_CONCANT를 사용하여 각 그룹 그룹을 사용하여보기를 만들었지 만보기를 추가 할 수 없으므로이를 수행 할 수있는 방법이 없습니다.

'SELECT *'와 같은 선택 호출을 1000 번 수행 어디에서 ID를 찾으십니까? 그리고? AND ... '는 효율적으로 보이지 않습니다.

단일 명령문으로 히트 한 스팬을 반환하거나 임시 테이블을 사용하여 스팸을 결합하는 방법이 있습니까?

답변

1

순차적 인 경우 (또는 ID로 순서를 지정하여 범위와 상호 연관시킬 수있는 경우) Python을 사용하여 각 그룹에 임의의 키를 적용한 다음 그룹의 일부로 사용하여 그룹화 할 수 있습니다. groupby. 예 :

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

감사합니다. 내가 이걸로 좀 더 일하게 내버려둬. 내가 돌아갈거야. 단락과 함께 새 테이블을 추가하는 것에 관해서는 각 단락 테이블 당 DB 크기가 상당히 증가하므로이 문제를 피하고자합니다. 5 개의 테이블을 추가하면 DB는 5 배 더 커집니다. – Tim

+0

FTI가 적용된 @Tim은 5 배 이상 커집니다. 그것은 당신이 직면하는 무역입니다. –

관련 문제