我正在使用Solr(v1.4.1)索引,该索引具有存储序列化JSON的字段。以下是Solr中文档中名为“json”的字段中存储的JSON示例。
{
"uri": "http://localhost/individual/n503",
"name": "Smith, Richard",
"title": "Programming CIO",
"items": [{
"uri": "http://localhost/individual/n1873",
"type": "http://localhost/individual/book"
}]
}
我想查询这个序列化的JSON字段是否存在URI(如http://localhost/individual/n1873
)。我正在使用Scala和SolrJ(v1.4.1)来查询结果。该函数如下所示:
def documentsForUri(uri: String) = {
var query = new SolrQuery();
query.setQuery( "json:" + uri )
var rsp = solr.query( query )
rsp.getResults()
}
将uri = "http://localhost/individual/n1873"
传递给函数结果0文档。我尝试将“:”更改为“\:”,这似乎没有帮助。在我的schema.xml中,我尝试将字段定义为solr.StrField
和solr.TextField
。例如:
<types>
...
<fieldType name="text" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"/>
...
</types>
<solrQueryParser defaultOperator="OR"/>
我尝试过的字段定义如下:
<fields>
...
<field name="json" type="text" indexed="true" stored="true" multiValued="false" required="false"/>
...
</fields>
和此:
<fields>
...
<field name="json" type="text_ws" indexed="true" stored="true" multiValued="false" required="false"/>
...
</fields>
这些组合都不适用于转义的uri查询字符串(“\:”)和非转义的uri字符串(“:”)。
是否有可能完成我想要做的事情?我真的试图在存储有序列化JSON的字段上的SQL查询中执行相似的“喜欢”。
答案 0 :(得分:3)
Here's a JSON tokenizer for Solr,遗憾的是补丁从未被提交过,所以它不包含在Solr中。或者你可以使用Noggit(或任何你喜欢的JSON解析器)并在客户端上预处理JSON(即在你的Scala代码中),然后将这些处理过的数据放在Solr的一个单独的索引字段中。