Форум сайта python.su
Сделал табличку на коуче, осталось туда прикрутить фильтры. С простеньким полнотекстовым поиском проблем не стало пока (не знаю что будет с большим количеством записей). А вот с фильтрами по колонкам встала одна большая проблема.
Первый вариант: что пришол в голову это получить данные в с каждой колонки занести их в запрос типа keys = но тут главный недостаток значения должны быть полными если в “названии” стоит скажем “Книга” то не передаш “ни” нужно передать “Книга”, то есть нельзя написать
keys = и тд. такой себе своеобразный оператор И. Эта возможность оказывается тока в стадии разработки и может планируется в следующих версиях: https://issues.apache.org/jira/browse/COUCHDB-194.
Второй вариант: это индекс то есть map по каждому полю но мне этот вариант кажется извращенным, многовато индексов получится и вообще при частом занесении данных в табличку времени будет уходить на обновление этих индексов наверно больше чем если просто создать temporary map. Во общем на первый взгляд никакого быстродействия на данном этапе. Может как то можно такие вот выборки сделать другим способом?
Отредактировано (Янв. 17, 2011 08:01:35)
Офлайн
alexandreКакие выборки? Вы так и не написали тольком, что за “фильтры” вы хотите сделать.
Может как то можно такие вот выборки сделать другим способом?
Офлайн
Допустим есть документы такого типа:
"head_field":{
"descr": "tgtttt",
"title": "матрица",
"price": "200",
"author": "вачовски",
"subtype": "очень хороший",
"date": "2011-01-12",
"genre": "фантастика"
}
"type":"book"
function(doc) {
var i;
var words = {};
var tails = {};
if (doc.doc_type == "book") {
for(var ii in doc.head_field){
var str = doc.head_field[ii];
str.replace(/[a-z0-9]+/gi,
function(word) {
words[word.toLowerCase()] = true;
}
);
}
for (w in words) {
for (i = 0; i < w.length; i += 1) {
tails[w.slice(i)] = true;
}
}
for (w in tails) {
emit(w, null);
}
}
}
docs_table = db.view("_design/filter/_view/substr", startkey=main_filter, endkey=main_filter + u"\ufff0", include_docs=True, limit=20, skip=0)
}
Отредактировано (Янв. 17, 2011 18:17:17)
Офлайн
Для полнотекстового поиска нужно применять CouchDB-Lucene. То что вы пытаетесь изобразить в общем случае не работает.
Офлайн
Мне не нужет супер полнотекстовый поиск это работает как мне нужно меня это полностью устраивает, мне интересно как можно получить диапазон значений или оператор И эмитировать.
Офлайн
alexandre
Вам же говорят, что никак. CouchDB сам по себе для этого не предназначен. Что можно использовать для этого, я уже посоветовал.
Офлайн
Придется наверно вникать в тонкости CouchDB-Lucene ниче не поделать. Но хочется верить что в коуче будет реализован дополнительный функционал и они не будут останавливаться на том что есть.
Офлайн