Apache Solrで空間検索を利用する際のスキーマの定義

Apache Solrで空間検索を利用する際は、schema.xmlに経度・緯度のフィールドを定義するだけではなく、ダイナミックフィールドも合わせて定義する必要があるので注意。

ダイナミックフィールドを定義していない場合、Apache Solrの起動時にエラーとなってしまう。

Apache Solr 新規コアの設定方法

Apache Solrではコアと呼ばれる単位で検索対象のデータ構造を定義するスキーマ等を保持する。
なのでApache Solrの勉強に新規にコアを作成・スキーマを定義して、Apache Solrを起動しようとしたらうまく動かなくて、つまずいたので記録。

構築環境は下記。

  • CentOS 6.7
  • Apache Solr-4.5.1
  • OpenJDK-1.7.0

まず、Apache Solrをインストールするとサンプルディレクトリが付いていて、その中にApache Solrを動かすのに必要なファイル等が一通り入っているので、それをコピーして流用する。(一から作るのは慣れないうちは大変…)

Apache Solrには「Solrホームディレクトリ」と呼ばれる、Solrサーバ稼働中にさまざまな場面でファイルを参照する起点となるディレクトリがある。
その中にコアに関する設定ファイルがあるのでそれを修正する。

これでコアの設定は終わったので、検索するデータに関する定義をschema.xmlに記載して、いざApache Solrを起動するとエラーとなり起動できなかった。

「textが定義されていない」という内容のエラーメッセージなので、schema.xmlにtextという定義に関して何か設定ミスがあるのかと思って調べてみたけれども、「text」という内容はどこにも記載していなかった。
いろいろ調べてみた結果schema.xmlではなく、コアの動作に関する設定ファイルであるsolrconfig.xmlの中の設定が原因だった。

どうもrequestHandlerの設定で「text」というフィールドをデフォルトで検索するようになっていた為に、「undefined field text」と怒られていたみたい。
下記リンクが参考になった。
stack overflow

デフォルトで検索するフィールドをshema.xmlで定義しているフィールドに設定すると、エラーとなることなくApache Solrの起動に成功。

CloudFormerで作成したテンプレートの注意点

CloudFormerを使用して既存のAWS上の環境をテンプレートにして、同じ環境を新たに作成したい事があるかと思うけれども、そういった場合、CloudFormerを使用して作成したテンプレートをそのまま使うと問題になるんじゃないかなと思った点があったのでメモ。

  • AWSリソースの名前が指定されていないので、そのまま使用するとリソース名が自動生成となる。
  • EC2のリソースを監視しているCloudWatchアラームをテンプレートにした場合、監視先のインスタンスIDが紐付いたままになる。(同じEC2のリソースを監視するアラームが新たに作成される)
  • CloudWatchLogGroupのアラームは、テンプレートを使用して作成した場合、CloudWatchLogGroupに同じ内容のアラームが追加で作成される。(同じ内容のアラームが新たに作成される)

リソース名が自動生成されるのは、作成したテンプレートにリソース名を指定するようにすれば対応可能。
下記はSNSにリソース名を指定した例。

CloudWatchアラームに関しては、他に良い方法があるかもしれないけれども、一度テンプレートを使用してアラームを作成後、変更を加えるか、もしくはテンプレートを使用しないで作成する必要があると思う。

AWS SDK for GOでのCloudSearch検索方法

前提条件として

  • CloudSearchでDomainが作成されている
  • CloudSearchに検索するためのデータが登録されている

が実施済みなこと。

下記のコードでGo言語を使用して、CloudSearchから検索できる。

まず、リージョンとCloudSearch Domainへのエンドポイントを指定して、cloudsearchdomainのインスタンスを作成する。
次にSearchInput構造体に検索文字列を設定して、最後にcloudsearchdomainのSearchメソッドで検索を行う。

これでCloudSearchから検索結果を取得できる。

また、同様の方法でCloudSearchのサジェスタを使用して、入力候補を取得する事ができる。

CloudSearchからの検索方法と同じように、構造体に入力候補を取得する為の情報を入力した後、Suggestメソッドで入力候補を取得可能。
Go言語の使い方は下記、AWS SDK for GoのAPI Referenceを見るとサンプルが付いているので判りやすい。
AWS SDK for GO API Reference

取得した入力候補をjsonにしてフロントエンドにレスポンスとして返し、フロントエンド側で入力候補を表示するように実装すれば、Googleの検索ボックスみたいにオートコンプリートを表示させる事ができるようになる。