【问题标题】:Indexing entire XML document on SOLR 7 with no field specification在 SOLR 7 上索引整个 XML 文档,没有字段规范
【发布时间】:2018-05-16 14:12:02
【问题描述】:

我会尝试在 SOLR 上放置一个 xml 文档(现在我使用的是 7.3.0 版本),而不在 data-config 中设置特定字段或放置一个标签来获取所有其他标签。我尝试使用无模式模式,但没有得到任何文档。有没有可能以某种方式来做这件事,还是SOLR处理不了?

这是我的 SOLR document.xml 的一个示例。我想检测所有标签并取回相对值而不编辑任何字段。就像我说的,我尝试了无模式模式,但它不起作用。

<?xml version="1.0" encoding="UTF-8"?>
<digital_archive xmlns="https://www.site" dataCreazione="2017-05-11T17:15:00">
<DocumentalCategory>some data</DocumentalCategory>
<customer>some data</customer>
<producer>some data</producer>
<documentOwner>some data</documentOwner>
<sources>
    <source>
        <idc>
            <id scheme="adfr">some data</id>
            <name>some data</name>
            <path>sources\source\some_path.XML</path>
            <hash alg="SHA-256">3748738</hash>
        </idc>
        <vdc>
            <id scheme="some data">some data.XML</id>
            <timeReference>2017-03-17T14:19:01+0100</timeReference>
        </vdc>
    </source>
</sources>
<ud>
    <metadati>
        <Name>Jane</Name>
        <Surname>Doe</Surname>
        <FiscalCode>dsrsd6w7hedw</FiscalCode>
        <Date>29.10.2017</Date>
    </metadati>

我期望的结果是这样的:

    <field name="DocumentalCategory">some data</DocumentalCategory>
<field name="customer">some data</customer>
<field name="producer">some data</producer>
<field name="documentOwner">some data</documentOwner>
<field name="sources">
    <field name="source">
        <field name="idc">
            <field name="id" scheme="adfr">some data</id>
            <field name="name">some data</name>
            <field name="path">sources\source\some_path.XML</path>

【问题讨论】:

  • 你想如何处理 XML 结构?
  • 我只是编辑我的问题。
  • 你可以在运行索引后尝试 curl localhost:8983/solr/collectionName/schema/fields
  • 这是我的 Json 响应:{ "status":0, "QTime":4}, "fields":[{ "name":"root", " type":"string", "docValues":false, "indexed":true, "stored":false}, { "name":"text", "type":"text_general", "multiValued":true, "indexed":true, "stored":false}, { "name":"version", "type":"plong", "indexed":false, "存储”:假},{“名称”:“id”,“类型”:“字符串”,“多值”:假,“索引”:真,“必需”:真,“存储”:真}]}
  • 当我发布 xml 文件时,Solr 接受它,但响应为空。

标签: xml solr dataimporthandler data-import schemaless


【解决方案1】:

Solr 不是数据库,它是一个搜索引擎。其目标是为您提供良好的搜索结果,同时保留原始结构不太重要。

虽然有一些方法可以获取嵌套文档,但您会发现之后的搜索会让您真正重新考虑您的导入过程。

因此,我建议您退后一步,先考虑一下您希望如何首先找到此信息以及将返回什么级别的记录/子记录。然后您可以重新访问导入问题。

无模式模式在这里对您没有帮助,因为它仍然希望您的文档是 Solr 格式,无论是 XML、JSON 还是 CSV。这里有一个自定义 XML 格式。因此,您需要以某种方式对其进行转换。您可以使用 Data Import Handler 并在输入过程中定义映射或 XSLT 转换,以使其符合 Solr 的期望。无论哪种方式,您很可能都必须进行一些扁平化和 id 映射。

【讨论】:

【解决方案2】:

使用 xslt 将自定义 xml 转换为 solr xml 可理解架构 下面是我的xml:-

 <?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="Rule.xsl"?>
<collection>
  <movie>
      <title>abc</title>
      <year>2016</year>
      <genre>comedy</genre>
  </movie>
  <movie>
      <title>xyz</title>
      <year>2017</year>
      <genre>animated</genre>
  </movie>
  <movie>
      <title>pqr</title>
      <year>2018</year>
      <genre>action</genre>
  </movie>
</collection>

下面是我执行转换的 xsl 文件:-

    <?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match='/collection'>
    <add>
      <xsl:apply-templates select="movie"/>
    </add>
  </xsl:template>
  <!-- Ignore score (makes no sense to index) -->
  <xsl:template match="movie/*[@name='score']" priority="100"></xsl:template>
  <xsl:template match="movie">
    <xsl:variable name="pos" select="position()"/>
    <doc>
      <xsl:apply-templates>
        <xsl:with-param name="pos"><xsl:value-of select="$pos"/></xsl:with-param>
      </xsl:apply-templates>
    </doc>
  </xsl:template>
  <!-- Flatten arrays to duplicate field lines -->
  <xsl:template match="movie/arr" priority="100">
    <xsl:variable name="fn" select="@name"/>
    <xsl:for-each select="*">
      <xsl:element name="field">
        <xsl:attribute name="name"><xsl:value-of select="$fn"/></xsl:attribute>
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:for-each>
  </xsl:template>
  <xsl:template match="movie/*">
    <xsl:variable name="fn" select="@name"/>
      <xsl:element name="field">
        <xsl:attribute name="name"><xsl:value-of select="local-name()"/></xsl:attribute>
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>
  <xsl:template match="*"/>
</xsl:stylesheet>

改造版:

    <add>
   <doc>
      <field name="title">abc</field>
      <field name="year">2016</field>
      <field name="genre">comedy</field>
  </doc>
   <doc>
      <field name="title">xyz</field>
      <field name="year">2017</field>
      <field name="genre">animated</field>
  </doc>
   <doc>
      <field name="title">pqr</field>
      <field name="year">2018</field>
      <field name="genre">action</field>
  </doc>
</add>

在线 xslt 网址:enter link description here

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2023-03-10
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多