3

在探索在 Solr 中索引维基百科数据的示例 时,我们如何才能获得预期的结果(即与导入的数据相同)?

有没有什么过程可以通过配置而不是组查询来实现,因为我有很多内部标签的数据。

我探索了 xslt 结果转换,但我正在寻找 json 响应。

进口文件:

<page>
<title>AccessibleComputing</title>
    <ns>0</ns>
    <id>10</id>
    <redirect title="Computer accessibility" />
    <revision>
    <id>381202555</id>
    <parentid>381200179</parentid>
    <timestamp>2010-08-26T22:38:36Z</timestamp>
    <contributor>
         <username>OlEnglish</username>
         <id>7181920</id>
    </contributor>
</revision>
</page>

solrConfig.xml:

<dataConfig>
        <dataSource type="FileDataSource" encoding="UTF-8" />
        <document>
        <entity name="page"
                processor="XPathEntityProcessor"
                stream="true"
                forEach="/mediawiki/page/"
                url="data/enwiki-20130102-pages-articles.xml"
                transformer="RegexTransformer,DateFormatTransformer"
                >
            <field column="id"        xpath="/mediawiki/page/id" />
            <field column="title"     xpath="/mediawiki/page/title" />
            <field column="revision"  xpath="/mediawiki/page/revision/id" />
            <field column="user"      xpath="/mediawiki/page/revision/contributor/username" />
            <field column="userId"    xpath="/mediawiki/page/revision/contributor/id" />
            <field column="text"      xpath="/mediawiki/page/revision/text" />
            <field column="timestamp" xpath="/mediawiki/page/revision/timestamp" dateTimeFormat="yyyy-MM-dd'T'hh:mm:ss'Z'" />
            <field column="$skipDoc"  regex="^#REDIRECT .*" replaceWith="true" sourceColName="text"/>
       </entity>
       </document>
</dataConfig>

solr 查询的响应:

  "response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "id": "10",
        "timestamp": "2010-08-26T17:08:36Z",
        "revision": 381202555,
        "titleText": "AccessibleComputing",
        "userId": 7181920,
        "user": "OlEnglish"
      }
    ]
  }

预期反应:

"response": {
    "numFound": 1,
    "start": 0,
    "docs": [
      {
        "id": "10",
        "timestamp": "2010-08-26T17:08:36Z",
        "revision": 381202555,
        "titleText": "AccessibleComputing",
        "contributor": [{
            "userId": 7181920,
            "user": "OlEnglish"
        }]
      }
    ]
  }
4

1 回答 1

2

如果您不喜欢使用XsltResponseWriter的想法(它也可以帮助 int 以 JSON 格式输出结果),您可以创建自己的SearchComponent,它将修改输出。当您使用自定义时SearchComponent,您可以将不同的 ResponseWriters 应用于输出(xml、json、csv、xslt 等)。

SearchComponent例如,您可以在本文中学习如何创建自定义。

要使用XsltResponseWriter,请将此代码添加到solrconfig.xml

<queryResponseWriter name="xslt" class="org.apache.solr.response.XSLTResponseWriter"/>

json.xsl将文件添加到conf/xslt文件夹,该文件夹具有 XML 输出的转换规则(当您wt=xml在查询中使用时),如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output method="text" indent="no" media-type="application/json"/>

  <xsl:template match="result">
    <xsl:text>{"response":{"docs":[</xsl:text>
    <xsl:apply-templates select="doc"/>
    <xsl:text>]}}</xsl:text>
  </xsl:template>

  <xsl:template match="doc">
    <xsl:if test="position() &gt; 1">
      <xsl:text>,</xsl:text>
    </xsl:if>
    <xsl:text>{"contributor": [{"userId": </xsl:text><xsl:value-of select="userId"/><xsl:text>, "user": "</xsl:text><xsl:value-of select="user"/><xsl:text>"}]}</xsl:text>
  </xsl:template>

</xsl:stylesheet>

然后,您可以使用以下网址获取此响应:

http://localhost:8983/solr/select/?q=id:10&wt=xslt&tr=json.xsl
于 2013-08-21T17:53:07.017 回答