通过键/特定字段限制couchdb-lucene结果?地图?

时间:2011-02-25 00:39:44

标签: lucene couchdb

我有一个非常直截了当的问题。

我正在使用couchdb-lucene来搜索我的文档的全文。

我的文件各有以下字段:

_id

_rev

docID(来自我们系统的文档的唯一ID)

标题(文件标题)

内容(文件正文)

userID(拥有该文档的用户)

我的设计文档看起来像这样:

{
   "_id": "_design/lucene",
   "_rev": "10-770b7044393e067b7024a896ccf3c502",
   "fulltext": {
       "by_all": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); ret.add(doc.content); return ret }"
       },
       "by_title": {
           "index": "function(doc) { var ret=new Document(); ret.add(doc.title); return ret }"
       }
   }
}

我无法弄清楚如何将docID作为结果的一部分返回,所以我现在只是将ID等于docID,但我想了解如何返回docID,因为上面的设计文档仅返回文档的分数和ID。我宁愿不必将ID设置为与docID相同的值来访问它。

当我运行如下的请求时:

本地主机:5984 /富/ _fti / _design / lucene的/ by_all Q =示例〜0.5F

我收回标题或内容字段包含“示例”的所有文档的集合,这很好,但是如何在标题和内容字段中仅搜索具有特定userID的文档中的“example” ?我怎样才能传入并使用该值?

我想做这样的事情:

本地主机:5984 /富/ _fti / _design / lucene的/ by_all Q =示例〜0.5F&安培;用户id = 123

当我这样做时:localhost:5984 / foo / _fti / _design / lucene / by_all?q = example~0.5f它返回所有用户的文档,我需要做什么才能将文档限制为属于a的文档具体用户?当只有几千个与特定用户相关时,我不想搜索数百万的文档。

谢谢!

P.S。我知道我可以在视图中使用地图:“map”:“function(doc){emit(doc._id,doc._rev)}”

这是相关的吗?有没有办法在couchdb-lucene结果中使用地图?我无法弄清楚如何指定在地图的键上使用哪个值,因此它默认返回ID,如何将键设置为使用特定字段?也许地图甚至不是正确的轨道......我不知道该怎么做,我对CouchDB和Lucene都很新,并且还没有完全理解它。

再次感谢!

1 个答案:

答案 0 :(得分:3)

这看似简单,但您需要更改索引功能。

function(doc) {
  var ret=new Document();
  ret.add(doc.title);
  ret.add(doc.content});
  ret.add(doc.userID, {"field":"userID"});
  ret.add(doc.docID, {"field":"docID","store":"yes"});
  return ret;
}

查询;

localhost:5984/foo/_fti/_design/lucene/by_all?q=example%20AND%20userID:123

只要userID等于123,这将在标题或内容中找到所有带“example”的文档。此外,docID值将在结果中返回。

HTH, 乙