2013-09-06 3 views
0

Я новичок в CouchDB. Как реализовать поиск по ключевым словам в CouchDB?Как реализовать поиск ключевого слова в CouchDB

Например, у меня есть документ пользователя в CouchDB. Структура выглядит следующим образом:

UsersCouchDB: 

id: 1 
last_name: jack 
first_name: abc 
phone_num: 123-456-7890 

id: 2 
last_name: rose 
first_name: gbcde 
phone_num: 123-111-2222 

... 

Я хочу реализовать функцию поиска для phone_num, так что если пользователь вводит в, скажем так, «23», то идентификатор 1 и идентификатор 2 должно быть показано, так как их номер телефона содержат «23».

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

Я слышал, что некоторые люди используют couchdb-lucene для выполнения подобной вещи. Может ли кто-нибудь показать мне некоторые коды о том, как сделать такие функции поиска?

ответ

3

Самый простой способ - использовать list functions. Однако, это эквивалентно полной операции сканирования:

function(head, req){ 
    var filter = function(key){ 
    if (!req.query.q){ 
     return key; // list all 
    } 
    if (!req.query.q.match('^[\d-]+$'){ 
     return; // don't allow regex injections 
    } 
    var match = key.match('.*' + req.query.q + '.*'); 
    if (match) return match[0]; 
    } 
    start({'headers': {'Content-Type': 'text/plain'}}); 
    var num = null; 
    while(row=getRow()){ 
    num = filter(row.key); 
    if (num){ 
     send(num + '\n'); 
    } 
    } 
} 

определяют также вид, испускающий номера телефонов для контактов:

function(doc){ 
    if(doc.type == 'contact'){emit(doc.phone_num, null)} 
} 

И называют с видом, который излучает только контакты, как: /db/_design/contacts/_list/search/phone?q=23

Самый быстрый способ - использовать couchdb-lucene.

Во-первых, создать индекс DDoc:

{ 
    "_id":"_design/contacts", 
    "fulltext": { 
     "by_phone": { 
      "index":"function(doc) { var ret=new Document(); ret.add(doc.phone_num); return ret }" 
     } 
    } 
} 

И запросить его, как http://localhost:5984/db/_fti/_design/contacts/by_phone?q=23

Смежные вопросы