java - 如何在CouchDB中实现关键字搜索

标签 java search lucene couchdb couchdb-lucene

我是 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”。

最简单或最快的方法是什么? 是否可以使用第 3 方包来实现此功能?

我听说有些人使用 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 + '\n');
    }
  }
}

还定义发出联系人电话号码的 View :

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

并使用仅发出联系人的 View 进行调用,例如:/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

查询它

关于java - 如何在CouchDB中实现关键字搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663441/

相关文章:

java - equals() 方法不适用于字符串

java - Java Stream.concat VS Collection.addAll 的性能

java - log4j 或 Logback 是否支持内存映射文件?

Solr括号和否定

java - 如何在相关实体中搜索(Hibernate 搜索)

ruby-on-rails - 将 SOLR/Lucene 搜索与 Rails 应用程序集成 - 哪些 gem ?提示?

java - websphere 的 OS 用户创建文件夹和写入文件需要什么 Linux 权限?

php - 如何读取sql中的当前值

html - 崇高文本 2 : How to search for every instance of an applied class?

php - PHP吐出PHP Parse错误:语法错误,/home/cg/root/main.php中第38行出现意外的“类”(T_CLASS)