문제

데이터베이스의 모든 항목을 반복하기 위해 다음보기 기능을 사용하고 있지만 (태그를 찾기 위해) 데이터 세트가 크면 성능이 매우 열악하다고 생각합니다. 다른 접근법이 있습니까?

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
도움이 되었습니까?

해결책

면책 조항 : 나는 이것을 테스트하지 않았으며 그것이 더 잘 수행 될 수 있는지 모릅니다.

단일 파마보기 생성 :

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

_view/your_view/all? startKey = [ 'your_tag_here'] & endkey = [ 'your_tag_here', {}

결과 JSON 구조는 약간 다르지만 여전히 게시 날짜 정렬을 얻을 수 있습니다.

다른 팁

Bahadir가 제안한 것처럼 단일 영구보기를 정의 할 수 있습니다. 그래도 이런 종류의 인덱싱을 할 때 ~하지 않다 각 키에 대한 문서를 출력하십시오. 대신, 방출 ([tag, doc.published], null). 현재 릴리스 버전에서는 각 문서에 대해 별도의 조회를 수행해야하지만 SVN 트렁크는 이제 쿼리 문자열에서 "include_docs = true"를 지정하는 것을 지원합니다. 공간 오버 헤드.

당신은보기로 올바른 길을 가고 있습니다. 그래도 생각의 목록 :

보기 생성은 점진적입니다. 트래픽을 읽는 것보다 트래픽이 더 크면 트래픽이 더 크면 조회수가 전혀 문제가되지 않습니다. 이것에 대해 걱정하는 사람들은 일반적으로 그렇게해서는 안됩니다. 참조 프레임, 업데이트없이 수백 개의 레코드를보기에 버리는 경우 걱정해야합니다.

전체 문서를 방출하면 속도가 느려집니다. 보기를 사용하는 데 필요한 것을 방출해야합니다.

val == "%s"성능이 무엇인지 확실하지 않지만 생각은 지나치게 생각해서는 안됩니다. 태그 배열이 있으면 태그를 방출해야합니다. 비 스트링이 포함 된 태그 배열을 기대하면이를 무시하십시오.

# 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)]

바이트 맵 함수는 "키"의 각 고유 태그와 함께 데이터를 반환 한 다음 해당 태그가있는 각 게시물을 반환합니다. value, 키 = "mytag"를 잡으면 "mytag"태그로 모든 게시물을 검색합니다.

약 10 개의 항목에 대해 테스트했으며 쿼리 당 약 0.0025 초가 걸리는 것처럼 보이며 큰 데이터 세트에서 얼마나 효율적인지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top