Apache solr无法索引JSON文件

时间:2016-09-04 18:06:49

标签: json apache solr

我是apache Solr的新手,做了一些研究并学会了如何做索引。 目前我正面临着JSON文件索引的问题。

我无法对下面提到的JSON文件数据格式编制索引。 删除“文档”数组后,我能够做到。 不知道为什么会发生这种情况。

我没有添加任何配置schema.xml文件。 尝试使用apache solr中的一些样本,我可以进行索引。

还有什么在schema.xml文件中使用id? 如果我的json包含employeesid,我可以添加employeesid而不是“id”

[{
  "employid": "E64492",
  "employGroup": "ABC ABC GROUP",
  "ssn": "BE0003565737",
  "country": {
      "countryId": "56",
      "countryName": "india"
  },
  "sector": {
      "sId": "40",
      "sName": "name"
  },
  "documents": [{
      "language": "EN",
      "fileName": "Helloworld.pdf",
      "fileExists": true,
      "employid": "E64492"
  }],
}]

请有人帮忙。

豁免详情:

"org.apache.solr.common.SolrException"],"msg":"Error parsing JSON field value. Unexpected OBJECT_START at [227], field=documents","code":400}}

4 个答案:

答案 0 :(得分:2)

问题在the Solr Reference guide section on indexing with JSON中解释,但在所有文本中都有点难以理解。

基本上有两种方法可以处理JSON:

  1. Solr输入格式,您可以使用Solr约定直接指定字段和递归结构。在这种格式中,您可以将多个JSON对象提供给解析器,因为您明确了解每个对象的结构。
  2. 按照您指定的规则(或默认情况下在您的集合的solrconfig.xml中指定)映射到Solr文档的通用JSON格式。
  3. 您使用的数组语法是第一个选项 - Solr输入格式。但是,该格式不支持嵌套文档的结构,它需要一个_childDocuments_数组。

    通用JSON解析器只能占用一个对象。

    所以,你处在十字路口,需要决定你想做什么。这很可能意味着要考虑您想要结束的模式,以及是否要明确地或通过映射规则来定义它。

答案 1 :(得分:1)

您必须定义与您尝试插入的文档相对应的架构。
此外,您还需要额外,个文档

"documents": [{
  "language": "EN",
  "fileName": "Helloworld.pdf",
  "fileExists": true,
  "employid": "E64492"
}],

关于id字段,您可以将其重命名为employe_id,但也要记得将标记<uniqueKey>id</uniqueKey>更改为employe_id

您还可以拥有不含unique_key的架构。有关唯一键的详细信息,请查看this

答案 2 :(得分:1)

Maddy你想要索引的是一个嵌套的JSON对象! Solr仅允许以FLAT格式索引JSON数据。我的意思是,Country和Sector对象无法按照您尝试的方式编制索引。您必须将它们拼合为单独的字段,即Country.countryId必须是一个单独的字段,Country.countryName必须是单独的字段。同样,Sector.sId必须是一个单独的字段,而Sector.sectorName必须是一个单独的字段。此外,最后一个文档JSON对象中的对象应该以声明employee Id的相同方式声明,您需要删除文档对象并自由地放置每个字段。我希望你明白这一点。这将100℅工作。我再说一遍,你不能像这样索引嵌套的JSON,你需要将JSON展平为最简单的。如果有帮助,请告诉我:)。为了更好地理解下面的要点,在Solr管理屏幕上,使用此JSON并尝试在“文档”部分中对其进行索引,同时通过单击F12在Chrome或其他浏览器中打开网络选项卡,您将看到与您相同的错误进入控制台!!这就是为什么你可以保持Country和Sector对象相同,但你需要删除数据对象并在其中自由声明字段。

答案 3 :(得分:0)

最后,我可以在添加下面指定的模式定义后进行索引编制

     <field name="buyLimit" type="tdoubles"/>
      <field name="country.countryId" type="tlongs"/>
      <field name="country.countryName" type="strings"/>
      <field name="creationDate" type="tlongs"/>
      <field name="currency" type="string" indexed="true" stored="true"/>
      ***<field name="documents.fileExists" type="booleans"/>
      <field name="documents.fileName" type="strings"/>
      <field name="documents.language" type="strings"/>
      <field name="documents.researchId" type="strings"/>***
      <field name="opinion.opinion" type="strings"/>
      <field name="opinion.opinionId" type="strings"/>
       <field name="employeId" type="string" multiValued="false" indexed="true" stored="true"/>
      <field name="s.sId" type="tlongs"/>
      <field name="s.sName" type="strings"/>
      <field name="type" type="string" indexed="true" stored="true"/>

感谢所有的评论,这些评论让我更了解索尔。