我应该在Solr中使用哪种字段类型,tokenizer和查询来搜索存储JSON的字段?

时间:2011-05-17 01:33:19

标签: json solr

我正在使用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.StrFieldsolr.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查询中执行相似的“喜欢”。

1 个答案:

答案 0 :(得分:3)

Here's a JSON tokenizer for Solr,遗憾的是补丁从未被提交过,所以它不包含在Solr中。或者你可以使用Noggit(或任何你喜欢的JSON解析器)并在客户端上预处理JSON(即在你的Scala代码中),然后将这些处理过的数据放在Solr的一个单独的索引字段中。

相关问题