在没有字段规范的情况下在 SOLR 7 上索引整个 XML 文档
Indexing entire XML document on SOLR 7 with no field specification
我会尝试在 SOLR
上放置一个 xml 文档(现在我使用的是 7.3.0 版本),而无需在数据配置中设置特定字段或放置一个标签来获取所有其他。我尝试使用无模式模式,但没有取回任何文档。有没有可能通过某种方式来做这件事,或者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>
Solr 不是数据库,它是搜索引擎。它的目标是为您提供良好的搜索结果,而保留原始结构不太重要。
虽然有一些方法可以导入嵌套文档,但您会发现之后的搜索会让您真正重新考虑导入过程。
因此,我建议您退一步考虑一下您希望如何首先找到这些信息以及返回什么级别 record/subrecord。然后你可以重新访问导入问题。
Schemaless 模式在这里不会帮助您,因为它仍然希望您的文档采用 Solr 格式,无论是 XML、JSON 还是 CSV。您在这里有一个自定义 XML 格式。因此,您需要以某种方式对其进行转换。您可以使用数据导入处理程序并定义映射或 XSLT 转换以使其符合 Solr 的期望。无论哪种方式,您很可能都必须进行一些扁平化和 ID 映射。
使用 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 url:enter link description here
我会尝试在 SOLR
上放置一个 xml 文档(现在我使用的是 7.3.0 版本),而无需在数据配置中设置特定字段或放置一个标签来获取所有其他。我尝试使用无模式模式,但没有取回任何文档。有没有可能通过某种方式来做这件事,或者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>
Solr 不是数据库,它是搜索引擎。它的目标是为您提供良好的搜索结果,而保留原始结构不太重要。
虽然有一些方法可以导入嵌套文档,但您会发现之后的搜索会让您真正重新考虑导入过程。
因此,我建议您退一步考虑一下您希望如何首先找到这些信息以及返回什么级别 record/subrecord。然后你可以重新访问导入问题。
Schemaless 模式在这里不会帮助您,因为它仍然希望您的文档采用 Solr 格式,无论是 XML、JSON 还是 CSV。您在这里有一个自定义 XML 格式。因此,您需要以某种方式对其进行转换。您可以使用数据导入处理程序并定义映射或 XSLT 转换以使其符合 Solr 的期望。无论哪种方式,您很可能都必须进行一些扁平化和 ID 映射。
使用 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 url:enter link description here