(Cloudant DB Java API) 执行类似的操作 Select Distinct with WHERE 子句

(Cloudant DB Java API) Perform similar operation Select Distinct with WHERE clause

我有一个与此类似的数据集。基本上它由不同页面的word文档组成,指示页码以及页面的全文。

{
  "_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",
}

到目前为止,我可以通过检查其中一篇文章 How do I do the SQL equivalent of "DISTINCT" in CouchDB?

来使用 Select Distinct Count 进行类似的查询

现在的问题是我如何能够搜索数据集,然后按 FILE_NAME 对它们进行分组(当 SQL 使用的代码是 SELECT DISTINCT FILE_NAME WHERE PAGE_FULLTEXT 像 "%hello%")

CouchDB 中 Distinct 的通常等价物是在查询时使用 MapReduce 视图和 group_level=1group=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 查询视图以生成与字符串 "hello world".

最匹配的文档