Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从HTML文件中提取元标记并在SOLR和TIKA中对它们进行索引_Solr_Apache Tika_Data Import_Solr4 - Fatal编程技术网

如何从HTML文件中提取元标记并在SOLR和TIKA中对它们进行索引

如何从HTML文件中提取元标记并在SOLR和TIKA中对它们进行索引,solr,apache-tika,data-import,solr4,Solr,Apache Tika,Data Import,Solr4,我试图提取HTML文件的元标记,并通过tika集成将它们索引到solr中。我无法使用Tika提取这些元标记,也无法在solr中显示 我的HTML文件如下所示 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="product_id" content="11"/> <meta name="assetid" content="10001"/> <met

我试图提取HTML文件的元标记,并通过tika集成将它们索引到solr中。我无法使用Tika提取这些元标记,也无法在solr中显示

我的HTML文件如下所示

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="product_id" content="11"/>
<meta name="assetid" content="10001"/>
<meta name="title" content="title of the article"/>
<meta name="type" content="0xyzb"/>
<meta name="category" content="article category"/>
<meta name="first" content="details of the article"/>

<h4>title of the article</h4>
<p class="link"><a href="#link">How cite the Article</a></p>
<p class="list">
  <span class="listterm">Length: </span>13 to 15 feet<br>
  <span class="listterm">Height to Top of Head: </span>up to 18 feet<br>
  <span class="listterm">Weight: </span>1,200 to 4,300 pounds<br>
  <span class="listterm">Diet: </span>leaves and branches of trees<br>
  <span class="listterm">Number of Young: </span>1<br>
  <span class="listterm">Home: </span>Sahara<br>
</p>
</p>

文章标题

长度:13至15英尺
到头顶的高度:高达18英尺
重量:1200至4300磅
饮食:树叶和树枝
年轻人数量:1
家:撒哈拉

我的data-config.xml文件如下所示

<dataConfig>
<dataSource name="bin" type="BinFileDataSource" />
    <document>   
    <entity name="f" dataSource="null" rootEntity="false"
        processor="FileListEntityProcessor"
        baseDir="/path/to/html/files/" 
        fileName=".*html|xml" onError="skip"
        recursive="false">

        <field column="fileAbsolutePath" name="path" />
        <field column="fileSize" name="size"/>
        <field column="file" name="filename"/>

        <entity name="tika-test" dataSource="bin" processor="TikaEntityProcessor" 
        url="${f.fileAbsolutePath}" format="text" onError="skip">

        <field column="product_id" name="product_id" meta="true"/>
        <field column="assetid" name="assetid" meta="true"/>
        <field column="title" name="title" meta="true"/>
        <field column="type" name="type" meta="true"/>
        <field column="first" name="first" meta="true"/>
        <field column="category" name="category" meta="true"/>      
        </entity>
    </entity>
</document>
</dataConfig>

在schema.xml文件中,我添加了以下字段

<field name="product_id" type="string" indexed="true" stored="true"/>
<field name="assetid" type="string" indexed="true" stored="true" />
<field name="title" type="string" indexed="true" stored="true"/>
<field name="type" type="string" indexed="true" stored="true"/>
<field name="category" type="string" indexed="true" stored="true"/>
<field name="first" type="text_general" indexed="true" stored="true"/>

在我的solrconfig.xml文件中,我添加了以下代码

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler" />
<lst name="defaults">
  <str name="config">/path/to/data-config.xml</str>
</lst>

/path/to/data-config.xml
有人知道如何从HTML文件中提取这些元标记,并在solr和Tika中为它们编制索引吗?您的帮助将不胜感激。

我认为meta=“true”并不是您所认为的意思。它通常指的是有关文件的内容,而不是内容。因此,内容类型等可能也会映射到http equiv

除此之外,还需要提取实际内容。您可以使用format=“xml”,然后使用xpathenticyprocessor放置一个内部实体,然后映射路径。除此之外,即使这样,您也会受到限制,因为在AFAIK中,DIH使用DefaultHtmlMapper,这在它允许的内容中是非常严格的,并且会跳过大多数“class”和“id”属性,甚至像“div”这样的东西。您可以在源代码中自己阅读


坦率地说,你更容易的方法是拥有一个SolrJ客户,自己管理Tika。然后您可以将其设置为使用identityhtmlapper,它不会影响HTML。

您使用的是哪个版本的Solr?如果您使用的是或更高版本,则会嵌入其中。Tika使用solrconfig.xml中配置的“solr-Cells”“ExtractingRequestHandler”类和solr通信,如下所示:

      <!-- Solr Cell Update Request Handler

       http://wiki.apache.org/solr/ExtractingRequestHandler 

    -->
  <requestHandler name="/update/extract" 
                  startup="lazy"
                  class="solr.extraction.ExtractingRequestHandler" >
    <lst name="defaults">
      <str name="lowernames">true</str>
      <str name="uprefix">ignored_</str>

      <!-- capture link hrefs but ignore div attributes -->
      <str name="captureAttr">true</str>
      <str name="fmap.a">links</str>
      <str name="fmap.div">ignored_</str>
    </lst>
  </requestHandler>
       <!-- some trie-coded dynamic fields for faster range queries -->
   <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
   <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
   <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
   <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
   <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>

   <dynamicField name="*_pi"  type="pint"    indexed="true"  stored="true"/>
   <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>

   <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
   <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

   <dynamicField name="random_*" type="random" />

   <!-- uncomment the following to ignore any fields that don't already match an existing 
        field name or dynamic field, rather than reporting them as an error. 
        alternately, change the type="ignored" to some other type e.g. "text" if you want 
        unknown fields indexed and/or stored by default --> 
   <!--dynamicField name="*" type="ignored" multiValued="true" /-->

 </fields>

真的
忽略_
真的
链接
忽略_
现在,在solr中,正如您在上述配置中所看到的,默认情况下,从HTML文档中提取的、未在schema.xml中声明的任何字段都以“忽略的”作为前缀,即它们被映射到schema.xml中的“忽略的”*“动态字段。默认的schema.xml如下所示:

      <!-- Solr Cell Update Request Handler

       http://wiki.apache.org/solr/ExtractingRequestHandler 

    -->
  <requestHandler name="/update/extract" 
                  startup="lazy"
                  class="solr.extraction.ExtractingRequestHandler" >
    <lst name="defaults">
      <str name="lowernames">true</str>
      <str name="uprefix">ignored_</str>

      <!-- capture link hrefs but ignore div attributes -->
      <str name="captureAttr">true</str>
      <str name="fmap.a">links</str>
      <str name="fmap.div">ignored_</str>
    </lst>
  </requestHandler>
       <!-- some trie-coded dynamic fields for faster range queries -->
   <dynamicField name="*_ti" type="tint"    indexed="true"  stored="true"/>
   <dynamicField name="*_tl" type="tlong"   indexed="true"  stored="true"/>
   <dynamicField name="*_tf" type="tfloat"  indexed="true"  stored="true"/>
   <dynamicField name="*_td" type="tdouble" indexed="true"  stored="true"/>
   <dynamicField name="*_tdt" type="tdate"  indexed="true"  stored="true"/>

   <dynamicField name="*_pi"  type="pint"    indexed="true"  stored="true"/>
   <dynamicField name="*_c"   type="currency" indexed="true"  stored="true"/>

   <dynamicField name="ignored_*" type="ignored" multiValued="true"/>
   <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>

   <dynamicField name="random_*" type="random" />

   <!-- uncomment the following to ignore any fields that don't already match an existing 
        field name or dynamic field, rather than reporting them as an error. 
        alternately, change the type="ignored" to some other type e.g. "text" if you want 
        unknown fields indexed and/or stored by default --> 
   <!--dynamicField name="*" type="ignored" multiValued="true" /-->

 </fields>

下面是如何处理'ignored'类型:

<!-- since fields of this type are by default not stored or indexed,
     any data added to them will be ignored outright.  --> 
<fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" />

因此,tika提取的元数据默认由Solr单元放在“忽略”字段中,这就是为什么在索引和存储时忽略它们的原因。 因此,要对元数据进行索引和存储,您可以更改已知元数据的“uprefix=attr_”或“创建特定字段或动态字段”,并根据需要对其进行处理

下面是更正后的solrconfig.xml:

  <!-- Solr Cell Update Request Handler

       http://wiki.apache.org/solr/ExtractingRequestHandler 

    -->
  <requestHandler name="/update/extract" 
                  startup="lazy"
                  class="solr.extraction.ExtractingRequestHandler" >
    <lst name="defaults">
      <str name="lowernames">true</str>
      <str name="uprefix">attr_</str>

      <!-- capture link hrefs but ignore div attributes -->
      <str name="captureAttr">true</str>
      <str name="fmap.a">links</str>
      <str name="fmap.div">ignored_</str>
    </lst>
  </requestHandler>

真的
属性_
真的
链接
忽略_

虽然是一个老问题,但我的回答是

  • 我最近问了一个类似的问题(几天后没有回复或评论),我整理了一下,这与这个问题有关

  • Solr在过去的几年中发生了很大的变化,关于这个主题的现有文档(如果存在的话)既令人困惑,有时甚至是错误的

  • 虽然篇幅很长,但此答复提供了一个示例和文档来解决该问题


  • 简而言之,我现在删除的StackOverflow问题是“提取自定义(例如,谢谢你的建议。我想SolrJ客户端是用于java应用程序的。我的应用程序是PHP,我使用的是SolPHP客户端。我可以用SolPHP做些什么吗?Tika是java的,我不确定你是否可以只通过配置来设置映射器。但是如果把Tika全部跳过,然后从P解析HTML,可能会更容易一些。)请详细说明solrJ的工作原理以及如何与现有Solr集成?