SolrとNutchを組み合わせてウェブサイトのインデックスを作成する

はじめに

Apache Nutch はオープンソースのウェブクローラです。Nutch でクロールした結果を Solr でインデックスするという連携が簡単にできるようになっています。

Nutch のインストール

ダウンロード

https://www.apache.org/dyn/closer.cgi/nutch/ から apache-nutch-1.18-bin.tar.gz をダウンロードします。

展開

$ tar zxf apache-nutch-1.18-bin.tar.gz
$ cd apache-nutch-1.18

設定ファイル

設定ファイルは conf/nutch-default.xml と conf/nutch-site.xml です。 nutch-default.xml にはコメントも詳しく書かれているので、読めば設定の意味を理解できます。変更したい箇所だけ nutch-site.xml に記述します。

<configuration>
  <property>
    <name>http.agent.name</name>
    <value>Splout Nutch Spider</value>
  </property>
</configuration>

同一サイトへの連続アクセスの際のディレイは fetcher.server.delay で5秒と設定されているので、今回はこのまま使います。robot.txt の有るサイトではその指示に従うようです。

クローリング対象の設定

urls/seed.txt というファイルに1行1URLでクローリングの起点となるURLを記述します。

mkdir urls
echo https://blog.splout.co.jp/ > urls/seed.txt

ドキュメントに含まれるリンクを次々と辿っていくわけですが、特定のサイト以外のURLはクローリングしないように指示することができます。そのためのファイルが conf/regex-urlfilter.txt です。

今回は blog.splout.co.jp だけを対象としますので、regex-urlfilter.txt の最後の行

+.

+^https?://blog\.splout\.co\.jp/

に変更します。

クローリング実行

Nutch にはクローリング実行用のスクリプトも含まれていますが、ここではチュートリアルに従って1ステップずつ実行してみます。

$ bin/nutch inject crawl/crawldb urls
$ bin/nutch generate crawl/crawldb crawl/segments
$ s1=`ls -d crawl/segments/2* | tail -1`
$ echo $s1
crawl/segments/20210925115243
$ bin/nutch fetch $s1
$ bin/nutch updatedb crawl/crawldb $s1

ここまでで1ターン終わりです。

inject (URLの起点をDBに入れる) → generate (セグメント(1回のfetch処理でアクセスされるURLの集合)を作成) → fetch (ウェブコンテンツの取得) → コンテンツデータベースの更新

という流れです。

ここまでで集まったURLを元にして次のターンを実行します。

$ bin/nutch generate crawl/crawldb crawl/segments -topN 100
$ s2=`ls -d crawl/segments/2* | tail -1`
$ bin/nutch fetch $s2
$ bin/nutch parse $s2
$ bin/nutch updatedb crawl/crawldb $s2

スクリプトを使えばこれを自動で回してくれるわけです。

Invertlinks作成

どのページがどこからリンクされているかの情報を作ります。

$ bin/nutch invertlinks crawl/linkdb -dir crawl/segments

Solrセットアップ

configsets/_default をベースにして schema.xml だけ Nutch で用意されているものを使います。

$ tar zxf solr-8.5.1.tgz
$ cd solr-8.5.1
$ mkdir server/solr/configsets/nutch
$ cp -r server/solr/configsets/_default/* server/solr/configsets/nutch/
$ cp ../apache-nutch-1.18/plugins/indexer-solr/schema.xml server/solr/configsets/nutch/conf/
$ rm server/solr/configsets/nutch/conf/managed-schema 
$ bin/solr start
$ bin/solr create -c nutch -d server/solr/configsets/nutch/conf/

Solrインデックス作成

インデックス作成に関する設定は conf/index-writers.xml にあります。Solrに関する設定は以下のとおりです。

  <writer id="indexer_solr_1" class="org.apache.nutch.indexwriter.solr.SolrIndexWriter">
    <parameters>
      <param name="type" value="http"/>
      <param name="url" value="http://localhost:8983/solr/nutch"/>
      <param name="collection" value=""/>
      <param name="weight.field" value=""/>
      <param name="commitSize" value="1000"/>
      <param name="auth" value="false"/>
      <param name="username" value="username"/>
      <param name="password" value="password"/>
    </parameters>
    <mapping>
      <copy>
        <!-- <field source="content" dest="search"/> -->
        <!-- <field source="title" dest="title,search"/> -->
      </copy>
      <rename>
        <field source="metatag.description" dest="description"/>
        <field source="metatag.keywords" dest="keywords"/>
      </rename>
      <remove>
        <field source="segment"/>
      </remove>
    </mapping>
  </writer>

インデックス作成を実行します。

$ bin/nutch index crawl/crawldb/ $s2 -filter -normalize -deleteGone
(略)
Indexing 67/67 documents
Deleting 0 documents
Indexer: number of documents indexed, deleted, or skipped:
Indexer:     67  indexed (add/update)
Indexer: finished at 2021-09-25 15:35:30, elapsed: 00:00:01

オプションの意味は以下の通りです。

  • filter: 設定済みのURLフィルタを使って不要なURLを弾く
  • normalize: インデックス前にURLを正規化する
  • deleteGone: 404になったページや内容が重複するページなどについてはインデックスからの削除のリクエストを出す

検索してみる

“solr”で検索してみます。

$ curl -s 'http://localhost:8983/solr/nutch/select?omitHeader=true&rows=1&q=content:solr'
{
  "response":{"numFound":26,"start":0,"docs":[
      {
        "tstamp":"2021-09-25T05:42:51.082Z",
        "digest":"7268d16a01450b9d925824316fa1a7e4",
        "boost":0.009592353,
        "id":"https://blog.splout.co.jp/12174/",
        "title":"Solrの記事リスト(〜2020年12月) | SPLOUT BLOG",
        "url":"https://blog.splout.co.jp/12174/",
        "content":"Solrの記事リスト(〜2020年12月) | SPLOUT BLOG\nWORKS\nCOMPANY\nRECRUIT\nBLOG\nCONTACT\ntoggle navigation\nWORKS\nCOMPANY\nRECRUIT\nBLOG\nPRIVACY POLICY\nSECURITY POLICY\nCONTACT\nSolrの記事リスト(略)",
        "_version_":1711854563263250432}]
  }}

記事IDとしてURLが使われていることが分かります。管理用のいくつかのフィールドを除くと、記事に関するフィールドは以下の通りです。

  • title: 記事タイトル
  • url: 記事URL
  • content: 記事本文

これらを変更する場合は、Nutch 側の conf/index-writer.xml と Solr 側の schema.xml を変更することになります。

コメント