如何在CouchDB中实现关键字搜索
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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”,则应显示id 1和id 2,因为他们的电话号码包含“23”。
什么是更简单或最快速的方法?是否有可能不使用第三方包来执行此功能?
我听说有些人使用couchdb-lucene做类似的事情。谁能告诉我一些关于如何制作这种搜索功能的代码?
答案
最简单的方法是使用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 + '
');
}
}
}
还定义为联系人发出电话号码的视图:
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
以上是关于如何在CouchDB中实现关键字搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 LINQ 在 NHibernate 3 中实现关键字搜索?
如何在 PaginatedDataTable Flutter Web 中实现搜索