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.