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

Limit couchdb-lucene results by key / specific field? map?

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

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

我的文件都有以下字段:

_ID

_rev

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

标题(文件标题)

内容(文件正文)

userID(拥有该文档的用户)

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

1
2
3
4
5
6
7
8
9
10
11
12
{
  "_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

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

我想做这样的事情:

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

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

谢谢!

附:我知道我可以在视图中使用地图:"map":"function(doc){emit(doc._id,doc._rev)}"

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

再次感谢!


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

1
2
3
4
5
6
7
8
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;
}

查询;

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

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

HTH,
B.