如何在 CouchDB 中创建索引搜索?

How to create index search in CouchDB?

假设在本地配置 couchDB,如何以及在何处创建类似于 Cloudant on Bluemix 的搜索索引?

你不能。搜索是 Cloudant 的一项功能,不在 CouchDB 的任何当前版本中。

要创建搜索索引,您需要创建 "view"。这在这里得到了很好的解释:http://guide.couchdb.org/editions/1/en/views.html

你可以直接从 Futon 开始做,但你应该先用一个小数据集练习。

我正在寻找的解决方案基于 this library

  1. 我必须安装 CouchDB 1.6.1 才能在 http://localhost:5984
  2. 上获得可用的数据库
  3. 下一步是安装 couchdb-lucene,已在 http://localhost:5985 上 运行ning 并成功响应。它是基于 Maven 的应用程序。

{"couchdb-lucene":"Welcome","version":"1.1.0-SNAPSHOT"}

为了实现 运行 我必须使用 mvn 在根目录中构建它,然后导航到目标和 运行 命令 ./bin/run 在解压缩的 couchdb-lucene 中:

root@mario-VirtualBox:/home/mario/CouchDB_mario/couchdb-lucene/target/couchdb-lucene-1.1.0-SNAPSHOT# ./bin/run
  1. 下一个约束是将这两个服务器连接在一起。我所要做的就是通过 /etc/couchdb/local.ini
  2. 中的代理映射它们

所有你需要的是下面这段代码:

[httpd_global_handlers]
_fti = {couch_httpd_proxy, handle_proxy_req, <<"http://localhost:5985">>}

多亏了它,我终于能够使用 Apache Lucene 索引查询 CouchDB。

  1. 在查询之前,我不得不插入我的自定义 JSON 设计文档,不是通过 UI 进行的新设计, 也不是新视图,但新 JSON 文档。本质上是用伪造的设计对 CouchDB 进行了一些修改,以便支持 Lucene 搜索。 我使用了以下格式的 CURL 请求

curl -X PUT http://localhost:5984/user14169_slovnik_medical/_design/medical -d @user14169_slovnik_medical.json

JSON 设计文档看起来像这样:

 {
   "_id": "_design/medical",
   "fulltext": {
       "by_meaning": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.vyznam); return ret }"
       },
       "by_shortcut": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.zkratka); return ret }"
       }
   }
}
  1. 举个例子。定义了这个搜索索引,让我们在 JSON 文档中说这种类型的数据:
  {
     "_id": "63e5c848fa2211c3b063d6feccd3d942",
     "_rev": "1-899a6924ed08097b1a37e497d91726fd",
     "DATAWORKS_DOCUMENT_TYPE": "user14169_slovnik_medical",
     "vyznam": "End to side",
     "zkratka": "e-t-s"
   }

那么你就可以轻松实现这样的查询:

http://localhost:5984/_fti/local/user14169_slovnik_medical/_design/medical/by_meaning?q=lob~

其中returns预期数据:

本地前缀是因为我运行在 1 个节点的本地主机上连接数据库,默认情况下 couchdb-lucene 连接到本地主机。

最酷的是你可以使用客户端 API org.lightcouch Java 中的 jar 库并进行一些简单的调用,例如这个:

CouchDbClient dbClient = new CouchDbClient("user14169_slovnik_medical", true, "http", "127.0.0.1", 5984, null, null);

String uriFullText = dbClient.getBaseUri() + "_fti/local/user14169_slovnik_medical/_design/medical/by_shortcut?q=lob*";

JsonObject result = dbClient.findAny(JsonObject.class, uriFullText);

System.out.println(result.toString());