0

我是 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”,那么应该显示 id 1 和 id 2,因为他们的电话号码包含“23”。

什么是更简单或最快的方法?是否可以使用 3rd 方包来执行此功能?

我听说有些人使用 couchdb-lucene 来做类似的事情。谁能告诉我一些关于如何制作这种搜索功能的代码?

4

1 回答 1

3

最简单的方法是使用列表函数。但是,这相当于全扫描操作:

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

于 2013-09-08T10:23:19.687 回答