使用CouchDB-lucene如何索引对象数组(而不是值)

时间:2011-09-07 00:03:17

标签: arrays json indexing couchdb couchdb-lucene

大家好,并提前感谢任何想法,建议或答案。

首先,环境:我正在使用CouchDB(目前正在开发1.0.2)和couchdb-lucene 0.7。显然,我使用couchdb-lucene(以下简称“c-l”)在couchdb中提供全文搜索。

其次,让我向大家提供一个示例couchdb文档:

{
   "_id": "5580c781345e4c65b0e75a220232acf5",
   "_rev": "2-bf2921c3173163a18dc1797d9a0c8364",
   "$type": "resource",
   "$versionids": [
       "5580c781345e4c65b0e75a220232acf5-0",
       "5580c781345e4c65b0e75a220232acf5-1"
   ],
   "$usagerights": [
       {
           "group-administrators": 31
       },
       {
           "group-users": 3
       }
   ],
   "$currentversionid": "5580c781345e4c65b0e75a220232acf5-1",
   "$tags": [
       "Tag1",
       "Tag2"
   ],
   "$created": "/Date(1314973405895-0500)/",
   "$creator": "administrator",
   "$modified": "/Date(1314973405895-0500)/",
   "$modifier": "administrator",
   "$checkedoutat": "/Date(1314975155766-0500)/",
   "$checkedoutto": "administrator",
   "$lastcommit": "/Date(1314973405895-0500)/",
   "$lastcommitter": "administrator",
   "$title": "Test resource"
}

第三,让我解释一下我想做什么。我想弄清楚如何索引'$ usagerights'属性。我非常松散地使用单词索引,因为我真的不关心能够搜索它,我只是想“存储”它以便与搜索结果一起返回。无论如何,该属性是一个json对象的数组。现在,组成数组的这些json对象将始终具有单个json属性。

根据我对couchdb-lucene的理解,我需要将此数组减少为以逗号分隔的字符串。我希望像“group-administrators:31,group-users:3”这样的东西能够成为最终输出。

因此,我的问题基本上是:如何将上面的$ usagerights json数组减少为couchdb-lucene使用的couchdb设计文档中逗号分隔的key:value对的字符串? < / p>

我发布的关于类似情况下标记索引的上一个问题,供参考:How-to index arrays (tags) in CouchDB using couchdb-lucene

最后,如果您需要任何其他详细信息,请发表评论,我会提供。

2 个答案:

答案 0 :(得分:3)

也许我错过了一些东西,但我从你上一个问题中看到的唯一区别是,你应该迭代这些对象。那么代码应该是:

function(doc) {
  var result = new Document(), usage, right;
  for(var i in doc.$usagerights) {
    usage = doc.$usagerights[i];
    for(right in usage) {
      result.add(right + ":" + usage[right]);
    }
  }
  return result;
}

答案 1 :(得分:2)

没有要求转换为以逗号分隔的值列表(我很想知道你从哪里得到这个想法)。

如果您只想在结果中返回$ usagerights项,请执行此操作;

ret.add(JSON.stringify(doc.$usagerights),
  {"index":"no", "store":"yes", "field":"usagerights"});

Lucene存储字符串,而不是JSON,因此您需要在查询时使用JSON.parse字符串。