自定义nutch索引编写器将值映射到弹性docin multielvel(如JSON)

时间:2017-04-06 09:31:50

标签: elasticsearch nutch indexwriter

我打算为apache nutch开发一个插件来自定义索引编写器,我的问题是,当你有权访问NutchDocument时,你只需将数据放在第一级而不是第二级。例如," a"," location"和" url"您可以轻松地按doc.add("url", "www.csad.com");放置数据,而对于"公司"这是一个复杂的对象,不可能发送公司calss的对象。

这是弹性搜索中的idnex_Metadata

{
   "properties":{
      "a":{
         "type":"string"
      },
      "company":{
         "type":"object",
         "properties":{
            "id":{
               "type":"integer",
               "index":"not_analyzed"
            },
            "type":{
               "type":"string",
               "index":"not_analyzed"
            },
            "name":{
               "type":"string"
            },
            "location":{
               "type":"geo_point"
            },
            "slug":{
               "type":"string",
               "index":"not_analyzed"
            }
         }
      },
      "location":{
         "type":"geo_point",
         "lat_lon":"true"
      },
      "url":{
         "type":"string",
         "index":"not_analyzed"
      }
   }
}

我无法向"公司"发送数据。在java插件中,虽然没有公司,但效果很好

      doc.add("location", rs.getString("ic_company_lat") + "," + rs.getString("ic_company_lng"));

      Company cmp = new Company();
      cmp.setId(Integer.parseInt(rs.getString("ic_company_id")));
      cmp.setType("type");
      cmp.setName(rs.getString("ic_company_name"));
      doc.add("company", cmp);

1 个答案:

答案 0 :(得分:0)

假设您正在使用elastic-indexer插件,Nutch开箱即用不支持使用自定义类进行索引(您可以将其添加到NutchDocument实例,但是您需要编写自己的逻辑来在索引器ES / Solr中处理它,即修改插件。

您可以使用简单的HashMap

来完成您想要的任务
Map map = new HashMap<String, String>();
map.put("name", "Company Name");
...

doc.add("company", map);

通过这种方式,您将获得一份文件,其中包含您在ES中的结构:

"company": {
    "name": "Awesome company",
    ...
},