如何在 SOLR 中索引 .html 文件

Posted

技术标签:

【中文标题】如何在 SOLR 中索引 .html 文件【英文标题】:How can I do indexing .html files in SOLR 【发布时间】:2013-01-20 14:37:04 【问题描述】:

我要索引的文件存储在服务器上(我不需要爬)。 /路径/到/文件/ 示例 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>

我在 solrconfing.xml 文件中添加了请求处理程序。

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

我的 data-config.xml 是这样的

<dataConfig>
<dataSource type="FileDataSource" />
<document>
    <entity name="f" processor="FileListEntityProcessor" baseDir="/path/to html/files/" fileName=".*html" recursive="true" rootEntity="false" dataSource="null">
        <field column="plainText" name="text"/>
    </entity>
</document>
</dataConfig>

我保留了默认的 schema.xml 文件,并将以下代码添加到 schema.xml 文件中。

 <field name="product_id" type="string" indexed="true" stored="true"/>
 <field name="assetid" type="string" indexed="true" stored="true" required="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"/>

 <uniqueKey>assetid</uniqueKey>

当我在设置后尝试进行完全导入时,它显示所有 html 文件都已获取。但是当我在 SOLR 中搜索时,它没有显示任何结果。有人知道可能是什么原因吗?

我的理解是所有文件都正确提取但未在 SOLR 中编制索引。有谁知道如何在 SOLR 中索引 HTML 文件的元标记和内容?

您的回复将不胜感激。

【问题讨论】:

【参考方案1】:

您的意思是在 data-config.xml 中包含 fileName="*.html" 吗?你现在有了 fileName=".*html"

我很确定 Solr 不会知道如何将您的元字段从您的 html 转换为索引字段。我没试过。

但是,我已经创建了读取 (x)html 的程序(使用 xpath)。这将创建一个格式化的 xml 文件以发送到 \update。此时,您应该可以使用 dataimporthandler 来查找格式化的 xml 文件。

【讨论】:

您的评论对我来说不是很清楚。您能否详细说明您是如何创建该程序的以及如何创建 XML 以及如何将其链接到 SOLR? 当然。该程序可以是一个 c# 或 Java 程序,用于读取您的 HTML 文件并从它们的 Meta 字段构建一个格式化的 xml 文件或文件。然后将 dataimporthandler 指向这些格式正确的 xml 文件以更新索引。这有帮助吗? 哦,这意味着我必须编写一个外部程序,最初我必须将所有文件提供给该程序,这将生成相关的 xml 文件,然后 SOLR 能够进行索引。我想要一些自动化和快速的东西,因为我有几个 TB(兆字节)的文件。所以最好有自动化流程。 你提到不想爬取 html 文件,这对nutch.apache.org 来说很容易我想我会使用 nutch 来爬取 html 文件,或者我会编写一个程序来读取html 文件并更新索引。我根本不会使用 dataimporthandler 你知道如何用 SOLR 配置 nutch apache 吗?我试过nutch一次,但没有成功。 nutch 的文档不是很清楚。如果你知道那么你能帮我设置和配置吗?【参考方案2】:

您可以使用Solr Extracting Request Handler 向 Solr 提供 HTML 文件并从 html 文件中提取内容。例如在link

Solr 使用Apache Tika 从uploaded html file 中提取内容

如果您想抓取网站并将其编入索引,Nutch with Solr 是一种更广泛的解决方案。Nutch with Solr Tutorial 将帮助您入门。

【讨论】:

我对 TIKA 配置更感兴趣。但是在文档中他们使用了 CURL 命令。我不想使用 CURL 我想要一些自动化的过程。你有任何关于 TIKA 和 SOLR 的工作示例吗?它会更清晰,更有帮助。 卷曲只是举例。您可以使用 Solrj 之类的客户端来检查您的文件夹并将更改推送到 Solr。您可以安排一个工作来做同样的事情。 Tika 充当包装器以对文件进行识别并使用库对其进行解析。您无需进行任何更改。 我已经发布了另一个关于 Tika1.2 和 solr4 配置的问题。Question 你能看看那里,告诉我我在做什么错吗?【参考方案3】:

最简单的方法是使用 bin 目录下的post 工具。它会自动完成所有工作。这是示例

./post -c conf1 /path/to/files/*

更多信息是here

【讨论】:

【参考方案4】:

这是一个将 HTML 转换为文本并提取相关元数据的完整示例:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import org.junit.Test;

import java.io.ByteArrayInputStream;

public class ConversionTest 

    @Test
    public void testHtmlToTextConversion() throws Exception 
        ByteArrayInputStream bais = new ByteArrayInputStream(("<html>\n" +
            "<head>\n" +
            "<title> \n" +
            " A Simple HTML Document\n" +
            "</title>\n" +
            "</head>\n" +
            "<body></div>\n" +
            "<p>This is a very simple HTML document</p>\n" +
            "<p>It only has two paragraphs</p>\n" +
            "</body>\n" +
            "</html>").getBytes());
        BodyContentHandler contenthandler = new BodyContentHandler();
        Metadata metadata = new Metadata();
        AutoDetectParser parser = new AutoDetectParser();
        parser.parse(bais, contenthandler, metadata, new ParseContext());
        assertEquals("\nThis is a very simple HTML document\n" + 
            "\n" + 
            "It only has two paragraphs\n" + 
            "\n", contenthandler.toString().replace("\r", ""));
        assertEquals("A Simple HTML Document", metadata.get("title"));
        assertEquals("A Simple HTML Document", metadata.get("dc:title"));
        assertNull(metadata.get("title2"));
        assertEquals("org.apache.tika.parser.DefaultParser", metadata.getValues("X-Parsed-By")[0]);
        assertEquals("org.apache.tika.parser.html.HtmlParser", metadata.getValues("X-Parsed-By")[1]);
        assertEquals("ISO-8859-1", metadata.get("Content-Encoding"));
        assertEquals("text/html; charset=ISO-8859-1", metadata.get("Content-Type"));
    

【讨论】:

以上是关于如何在 SOLR 中索引 .html 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Solr索引MySql数据库

如何设置/配置solr索引文件的最大大小?

如何在 Apache SolR 中索引 pdf/word 文档

如何在 Solr 中获取最后一个索引记录?

solr.Net课程二 solr5.5之core配置

Solr添加文档(XML)