我有一个类似的数据集。基本上,它由不同页面的单词文档组成,指示页码以及页面的全文。
{
"_id": "4b36u6vwkZH16H5vmc24sBfuZk0CRqfP",
"_rev": "1-r5WQDAJPPuUP0oLapZrMiMRd6rOaTIz9",
"FILE_NAME": "sample.doc",
"PAGE_NUM": 1,
"PAGE_FULLTEXT": "hello world",
},
{
"_id": "nDIKw5JUWFWVD8m7HEODMa1vNI5gFEXS",
"_rev": "1-nEp7zsuaneJj2AInyPpeBWDNP90ZGpWQ",
"FILE_NAME": "sample.doc",
"PAGE_NUM": 2,
"PAGE_FULLTEXT": "this is john doe",
},
{
"_id": "vCTlNbNk3X893FkWSYnn87L9j371taYZ",
"_rev": "1-oJPspiBHRPeT99m8VPV9qoDTTBoJ9tVK",
"FILE_NAME": "sample-2.doc",
"PAGE_NUM": 1,
"PAGE_FULLTEXT": "this is another document",
},
{
"_id": "2FSDuaEa5bYtP2l7lEgMnqMnqsZpMJUs",
"_rev": "1-ZQRkvfMluu0NQWYH2FUATuXy9uNtOGyk",
"FILE_NAME": "sample-2.doc",
"PAGE_NUM": 2,
"PAGE_FULLTEXT": "page 2 of sample-2.doc",
},
{
"_id": "RET7G6hUU9zSplgW7FIXWKwIVex2NEmI",
"_rev": "1-mlryGv830RNllPwFT7JDDvJoKXuvxAXD",
"FILE_NAME": "sample-3.doc",
"PAGE_NUM": 1,
"PAGE_FULLTEXT": "hello lionel",
},
{
"_id": "VBL6BJBevcvUc6EsJ68bAjHuGRJ6zvMt",
"_rev": "1-fPIJQHKCB2WitR74l1X8I6TOBMhMeCWF",
"FILE_NAME": "sample-3.doc",
"PAGE_NUM": 2,
"PAGE_FULLTEXT": "page hello 2 of sample-3.doc",
}
到目前为止,我能够通过查看其中一篇帖子来对SelectDistinctCount进行类似的查询;DISTINCT";在CouchDB中?
现在的问题是,我如何能够搜索数据集,然后按FILE_NAME对它们进行分组(当使用SQL代码时,输出类似于SELECT DISTINCT FILE_NAME WHERE PAGE_FULLTEXT like"%hello%")
CouchDB中的Distinct通常等效于在查询时使用MapReduce视图和group_level=1
或group=true
。
但你的问题更大的部分是WHERE PAGE_FULLTEXT like "%hello%"
位。正如您所指出的,MapReduce视图不适合模糊匹配。
幸运的是,Cloudant拥有Cloudant Search,它允许创建全文索引。Cloudant Search索引是在一个函数(如MapReduce)中定义的,使用index
函数来定义要索引的字段。最简单的是,使用您的样本数据,索引函数是:
function(doc) {
index("default", doc.PAGE_FULLTEXT);
}
它将您的文档摘要索引到默认字段中。
索引后,可以使用/_design/yourdesigndoc/_search/yourindexname?q=hello+world
查询视图,以生成与字符串"helloworld"最匹配的文档。