2008-10-17 7 views
4

다음보기 함수를 사용하여 데이터베이스의 모든 항목을 반복하여 (태그를 찾기 위해), 데이터 집합이 큰 경우 성능이 매우 좋지 않다고 생각합니다. 다른 방법이 있습니까?CouchDB를 사용하여 "태깅"지원을 구축하는 방법은 무엇입니까?

def by_tag(tag): 
return ''' 
     function(doc) { 
      if (doc.tags.length > 0) { 
       for (var tag in doc.tags) { 
        if (doc.tags[tag] == "%s") { 
         emit(doc.published, doc) 
        } 
       } 
      } 
     }; 
     ''' % tag 

답변

7

면책 조항 :이 테스트를 수행하지 않았으며 성능이 더 좋은지 잘 모릅니다.

단일 파마보기 만들기 :와

function(doc) { 
    for (var tag in doc.tags) { 
    emit([tag, doc.published], doc) 
    } 
}; 

그리고 쿼리를 _view/your_view/모든 startkey = [ 'your_tag_here'] & endkey = [ 'your_tag_here', {}]

? 결과 JSON 구조는 약간 다르지만 게시 날짜 정렬은 계속됩니다.

+0

실제로!'startkey'를 사용하면 이렇게하는 것이 올바른 방법 일 것입니다. – rfunduk

+1

emit ([doc.tags [doc], doc.published), doc)하지 않아야하나요? 그렇지 않으면, 내가 잘못 본 것이 아니라면, 당신은 지표를 방출 할 것입니다. –

1

보기가 옳은 트랙에 있습니다. 생각의 목록 :

보기 생성은 증분입니다. 읽기 트래픽이 쓰기 트래픽보다 많으면 조회가 문제를 일으키지 않습니다. 이 문제에 대해 우려하는 사람들은 일반적으로해서는 안됩니다. 참고 문헌의 프레임으로 업데이트하지 않고도 수백 개의 레코드를 뷰에 쏟아 넣는다면 걱정해야합니다.

전체 문서를 내 보내면 처리 속도가 느려집니다. 보기의 사용에 필요한 것만 방출해야합니다.

val == "% s"성능이 무엇인지는 확실치지 않지만 지나친 생각은하지 않아야합니다. 태그 배열이 있으면 태그를 내 보내야합니다. 비 문자열을 포함 할 태그 배열을 기대한다면 이것을 허용하고 이것을 무시하십시오.

+0

안녕 폴, 포인트 주셔서 감사합니다. 임시보기도 점진적으로 생성됩니까? Jan L.이 다른 스레드에서 언급했듯이, temp-views는 프로덕션에서 사용되어서는 안됩니다. 복용량이라 함은 각 태그마다 perm-views를 만들어야한다는 뜻입니까? –

+0

Senmiao, 임시보기의 문제점은 일시적인 것입니다. 일단 클라이언트를 사용하지 않으면 삭제되고 다음 요청은 전체 뷰를 다시 작성해야합니다. –

+0

뷰를 SQL 쿼리로 생각하지 마십시오. 뷰는 일반적으로 특정 쿼리가 아닌 쿼리 클래스에 응답하도록 설계되어야합니다. 귀하의 경우 모든 태그에 대해 하나의보기를 원하며 각 태그에 대해 하나의보기를 원하지는 않습니다. –

3

Bahadir에서 제안하는 것처럼 하나의 영구보기를 정의 할 수 있습니다. 이런 종류의 색인을 만들 때, 은 각 키의 문서를 출력하지 않습니다. 대신 emit ([tag, doc.published], null). 현재 릴리스 버전에서는 각 문서에 대해 별도의 조회를 수행해야하지만 SVN 트렁크는 이제 쿼리 문자열에 "include_docs = True"를 지정할 수있는 지원을 제공하고 CouchDB는 자동으로 문서를보기에 병합합니다. 공간 오버 헤드.

0
# Works on CouchDB 0.8.0 
from couchdb import Server # http://code.google.com/p/couchdb-python/ 

byTag = """ 
function(doc) { 
if (doc.type == 'post' && doc.tags) { 
    doc.tags.forEach(function(tag) { 
     emit(tag, doc); 
    }); 
} 
} 
""" 

def findPostsByTag(self, tag): 
    server = Server("http://localhost:1234") 
    db = server['my_table'] 
    return [row for row in db.query(byTag, key = tag)] 

byTag지도 기능은 "키", value에서 해당 태그가 각 게시물에 각각의 고유 한 태그 데이터를 반환합니다, 그래서 당신은 키 = "mytag"를 잡아 때, 그것은 모든 게시물을 검색합니다 태그 "mytag". 나는 약 10 개 항목에 대해 그것을 테스트했고 큰 데이터 세트가 얼마나 효율적 확실하지 쿼리 당 약 0.0025 초 정도 걸릴 것으로 보인다

..

+0

Bahadır의 제안에 따라 영구 뷰를 사용하는 것이 더 효율적입니다. –