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

Arrays 使用CouchDB lucene如何索引对象数组(而不是值),arrays,json,indexing,couchdb,couchdb-lucene,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", "$typ

大家好,提前感谢大家的想法、建议或回答

首先是环境:我正在使用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的理解,我需要将这个数组简化为逗号分隔的字符串。我希望最终输出类似“组管理员:31,组用户:3”的内容

因此,我的问题本质上是:如何在couchdb lucene使用的couchdb设计文档中将上面的$usagerights json数组减少为逗号分隔的键:值对字符串?

我之前发布的一个关于类似情况下标签索引的问题,仅供参考:


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

也许我遗漏了什么,但我从您之前的问题中看到的唯一区别是,您应该迭代对象。那么代码应该是:

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;
}

也许我遗漏了一些东西,但我从前面的问题中看到的唯一区别是,应该迭代对象。那么代码应该是:

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;
}

不需要转换为逗号分隔的值列表(我很想知道你是从哪里学到这个想法的)

如果您只是希望$usagerights项与结果一起返回,请执行此操作

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

Lucene存储字符串,而不是JSON,因此您需要在查询时解析字符串

不需要转换为逗号分隔的值列表(我很想知道你是从哪里学到这个想法的)

如果您只是希望$usagerights项与结果一起返回,请执行此操作

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

Lucene存储字符串,而不是JSON,因此您需要在查询时解析字符串

罗伯特,谢谢你抽出时间。我应该说得更清楚些。正如您所说的,它需要是一个字符串,而不是JSON。我只是添加了逗号要求,这样我就可以很容易地在程序中解析返回的“store”值。我真的很感谢你的帮助。谢谢你在这个项目上的工作!由于Robert的简化代码和c-l字段(如索引、存储、字段)的包含,此处给出了正确答案。我忘了使用索引字段,所以谢谢你的提醒。不客气!我很高兴你喜欢couchdb lucene:)我将在这里为那些遵循我的答案的人添加一个警告。CouchDB Lucene没有定义JSON类,因此您当前需要自己包含它,以遵循我上面的建议。不过,也许我可以在0.9以后再添加它。我升级到Rhino 1.7R3,其中包括JSON类(添加了一个单元测试来证明它),因此这将从0.9.0以后开始工作。Robert,嘿,感谢您花时间。我应该说得更清楚些。正如您所说的,它需要是一个字符串,而不是JSON。我只是添加了逗号要求,这样我就可以很容易地在程序中解析返回的“store”值。我真的很感谢你的帮助。谢谢你在这个项目上的工作!由于Robert的简化代码和c-l字段(如索引、存储、字段)的包含,此处给出了正确答案。我忘了使用索引字段,所以谢谢你的提醒。不客气!我很高兴你喜欢couchdb lucene:)我将在这里为那些遵循我的答案的人添加一个警告。CouchDB Lucene没有定义JSON类,因此您当前需要自己包含它,以遵循我上面的建议。不过,也许我可以在0.9以后再添加这个。我升级到Rhino 1.7R3,其中包含JSON类(添加了一个单元测试来证明它),因此这将从0.9.0以后开始工作。Marcello,非常感谢您的回复。我试过你的方法,效果很好。马塞洛,非常感谢你的回复。我已经试过你的方法了,效果很好。