CouchDB несколько тегов

http://www.postgresql.org/docs/8.2/static/using-explain.html

В основном, последовательное сканирование идет в фактические строки, и начните читать из строки 1 и продолжите, пока запрос не удовлетворен (это не может быть всей таблицей, например, в случае предела)

, Растровое сканирование "кучи" означает, что PostgreSQL нашел, что маленькое подмножество строк выбирает (например, от индекса), и собирается выбрать только те строки. Это будет, конечно, иметь намного больше поиска, так быстрее только, когда ему нужно маленькое подмножество строк.

Берут пример:

create table test (a int primary key, b int unique, c int);
insert into test values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5);

Теперь, мы можем легко получить сканирование seq:

explain select * from test where a != 4

                       QUERY PLAN                        
---------------------------------------------------------
 Seq Scan on test  (cost=0.00..34.25 rows=1930 width=12)
   Filter: (a <> 4)

Это сделало последовательное сканирование, потому что это оценивает своя попытка захватить подавляющее большинство таблицы; стремясь сделать это (вместо большого, seekless чтение) было бы глупо.

Теперь, мы можем использовать индекс:

explain select * from test where a = 4 ;
                              QUERY PLAN                              
----------------------------------------------------------------------
 Index Scan using test_pkey on test  (cost=0.00..8.27 rows=1 width=4)
   Index Cond: (a = 4)

И наконец, мы можем получить некоторые растровые операции:

explain select * from test where a = 4 or a = 3;
                                  QUERY PLAN                                  
------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=8.52..13.86 rows=2 width=12)
   Recheck Cond: ((a = 4) OR (a = 3))
   ->  BitmapOr  (cost=8.52..8.52 rows=2 width=0)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 4)
         ->  Bitmap Index Scan on test_pkey  (cost=0.00..4.26 rows=1 width=0)
               Index Cond: (a = 3)

Мы можем считать это как:

  1. Сборка битовый массив строк мы хотим для a=4. (Битовый массив индексирует сканирование)
  2. Сборка битовый массив строк, которые мы хотим для a=3. (Растровое индексное сканирование)
  3. Или два битовых массива вместе (BitmapOr)
  4. Ищут те строки в таблице (Растровое Сканирование "кучи") и проверка для проверки a=4, или a=3 (перепроверьте конусовидный)

[Да, эти планы запросов глупы, но поэтому нам не удалось проанализировать test, Проанализировали нас это, они все будут последовательными сканированиями, так как существует 5 крошечных строк]

13
задан Abie 28 September 2009 в 05:56
поделиться

4 ответа

В более поздних версиях CouchDB вы можете выполнить POST в представление с документом JSON под названием keys , что позволяет выполнять поиск по нескольким ключам. Структура будет выглядеть примерно так:

{"keys": ["first_tag", "second_tag", "third_tag"]}

Это может быть отправлено POST в ваше представление, которое генерирует теги для своих соответствующих ключей.

Этот и другие параметры запроса описаны здесь .

]
6
ответ дан 2 December 2019 в 01:11
поделиться

One way of doing is as explained above by Ryan Duffield. Though it solves some of the queries but it will become unmanageable over the period of time. Otherway is to use Full Text Search which is not currently supported by CouchDB but there is an external plugin using Lucene. more here http://wiki.apache.org/couchdb/Full_text_search.

0
ответ дан 2 December 2019 в 01:11
поделиться

На самом деле теги кажутся очень реляционной проблемой и плохо сочетаются с дизайном CouchDB. Поэтому я решил создать одну небольшую базу данных для тегов на mysql, а фактические документы хранить в CouchDB. Это позволяет мне получить лучшее из обоих миров. Хотя у этого метода есть проблемы, связанные с синхронизацией, поиск по тегам - эффективная операция в sql, и с контентом не стоит беспокоиться о репликации или сегментировании. Спасибо за все ваши ответы.

-2
ответ дан 2 December 2019 в 01:11
поделиться

So, as far as I understood the answer is NO. CouchDB не может запрашивать документы, содержащие несколько тегов (обходной путь с lucene или mysql не учитывается, таким образом мы потеряли некоторые функции CouchDB). Печальная новость: (.

(наличие нескольких тегов - имеющих и A, и B, а не A или B)

UPD! Это возможно, но с ограничениями до 2–3 тегов.

http://wiki.apache.org/couchdb/EntityRelationship

Запросы по нескольким ключам

Некоторым приложениям необходимо просматривать пересечение сущностей, имеющих несколько ключи. В приведенном выше примере это будет запрос для контактов, которые находятся в группах «Друзья» и «Коллеги». Самый простой способ справиться с этой ситуацией - запросить один из ключей, а затем отфильтровать по остальным ключам на стороне клиента. Если частоты ключей сильно различаются, также может быть целесообразно выполнить первоначальный вызов, чтобы определить ключ с наименьшей частотой и использовать его для извлечения исходного списка документов из базы данных.

Если это не лучший вариант. , можно индексировать комбинации клавиш, хотя рост индекса для данного документа будет экспоненциальным в зависимости от количества его ключей. Тем не менее, для небольших наборов ключей это вариант, поскольку ключи могут быть упорядочены, а ключи, которые являются префиксами большего ключа, могут быть опущены. Например, для набора ключей [1 2 3] возможными комбинациями клавиш являются [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3]. Однако индекс должен содержать только ключи [3] [1 3] [2 3] [1 2 3], поскольку (например) документы, соответствующие ключам [1 2], могут быть получены с помощью запроса для startkey = [1,2, null] и endkey = [1,2, {}] Число записей индекса будет равно 2 ^ (n-1) число ключей.

Последний вариант - использовать отдельный индекс, например couchdb-lucene, чтобы помочь с такими запросами .

0
ответ дан 2 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: