CouchDB를 사용하여 "태깅"지원을 구축하는 방법은 무엇입니까?
-
03-07-2019 - |
문제
데이터베이스의 모든 항목을 반복하기 위해 다음보기 기능을 사용하고 있지만 (태그를 찾기 위해) 데이터 세트가 크면 성능이 매우 열악하다고 생각합니다. 다른 접근법이 있습니까?
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 초가 걸리는 것처럼 보이며 큰 데이터 세트에서 얼마나 효율적인지 확실하지 않습니다.