Найти - Пользователи
Полная версия: CouchDB и фильтры по колонкам таблицы.
Начало » Базы данных » CouchDB и фильтры по колонкам таблицы.
1
alexandre
Сделал табличку на коуче, осталось туда прикрутить фильтры. С простеньким полнотекстовым поиском проблем не стало пока (не знаю что будет с большим количеством записей). А вот с фильтрами по колонкам встала одна большая проблема.

Первый вариант: что пришол в голову это получить данные в с каждой колонки занести их в запрос типа keys = но тут главный недостаток значения должны быть полными если в “названии” стоит скажем “Книга” то не передаш “ни” нужно передать “Книга”, то есть нельзя написать
keys = и тд. такой себе своеобразный оператор И. Эта возможность оказывается тока в стадии разработки и может планируется в следующих версиях: https://issues.apache.org/jira/browse/COUCHDB-194.

Второй вариант: это индекс то есть map по каждому полю но мне этот вариант кажется извращенным, многовато индексов получится и вообще при частом занесении данных в табличку времени будет уходить на обновление этих индексов наверно больше чем если просто создать temporary map. Во общем на первый взгляд никакого быстродействия на данном этапе. Может как то можно такие вот выборки сделать другим способом?
Александр Кошелев
alexandre
Может как то можно такие вот выборки сделать другим способом?
Какие выборки? Вы так и не написали тольком, что за “фильтры” вы хотите сделать.
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)
}
Вопрос простой как в параметры можно передать не одно слово а несколько и получить документы в которых есть эти значения? Без диапазона полнотекстовый поиск не будет сделан таком варианте. Насколько я понимаю это можно сделать только с функцией которая только будет реализована в будущем функционале коуча.
Александр Кошелев
Для полнотекстового поиска нужно применять CouchDB-Lucene. То что вы пытаетесь изобразить в общем случае не работает.
alexandre
Мне не нужет супер полнотекстовый поиск это работает как мне нужно меня это полностью устраивает, мне интересно как можно получить диапазон значений или оператор И эмитировать.
Александр Кошелев
alexandre
Вам же говорят, что никак. CouchDB сам по себе для этого не предназначен. Что можно использовать для этого, я уже посоветовал.
alexandre
Придется наверно вникать в тонкости CouchDB-Lucene ниче не поделать. Но хочется верить что в коуче будет реализован дополнительный функционал и они не будут останавливаться на том что есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB