我有一个非常直截了当的问题。
我正在使用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都很新,并且还没有完全理解它。
再次感谢!
答案 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, 乙