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 (結果を JSON で int 出力するのにも役立ちます) を使用するという考えが気に入らない場合はSearchComponent、出力を変更する独自の を作成できます。カスタムを使用するSearchComponentと、さまざまな ResponseWriters を出力 (xml、json、csv、xslt など) に適用できます。

たとえばSearchComponentこの記事でカスタムを作成する方法を学ぶことができます。

を使用するXsltResponseWriterには、次のコードを に追加しますsolrconfig.xml

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

次のように、XML出力の変換ルールを持つフォルダーにjson.xslファイルを追加します(クエリで使用する場合)。conf/xsltwt=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>

次に、次のような URL を使用してこの応答を取得できます。

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