Archive for the ‘Solr’ Category

こんにちは、Curious Vehicle中鉢です。

本日、弊社サービスのCLOUDSOLR上に
位置情報検索紹介用のページを作成しました。
Solrのみではなかなか視覚的にわかりづらいため、
位置情報をGoogle MapのAPIを利用して地図上にプロットし
視覚的に位置情報検索をわかりやすくしてあります。
ぜひ一度位置情報検索がどのようなものかご覧になってみてください。

https://solr.jp/map

さて、本日は上記の位置情報検索紹介用ページで利用されている
SolrのSpartial Searchという機能の説明をさせていただこうと思います。

Solrにはspartial searchという位置情報を検索するための機能があり、
その機能を使うことで

特定の地点から一定の距離の範囲内にある位置情報検索する。

といった位置情報を利用した機能を実装することができるようになります。

それでは、solr側でどういう設定をして、どういったデータをインデキシングし、
クライアント側からはどう検索できるのか、というのを順を追って説明していきます。

  1. schema.xmlの設定
    まずはSolr側の設定です。
    これはSolrのexample/solr/collection1/conf/schema.xmlの設定を
    そのまま利用しますので、すでに定義されている場合は
    飛ばしてしまってかまいません。

    <!-- locatoinというfieldTypeと
     *_p、*_coodinateというdynamicFieldを設定します -->
    <!-- example/solr/collection1/conf/schema.xml には
    すでに定義されているので、そこから変えていなければ
    追加する必要はありません。 -->
    
    <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
    <fieldType name="location"
     subFieldSuffix="_coordinate"/>
    
    <!-- Type used to index the lat and lon components for the "location" FieldType -->
    <dynamicField name="*_coordinate"
     type="tdouble"
     indexed="true"
     stored="false" />
    ・
    ・
    ・
    <dynamicField name="*_p"
     type="location"
     indexed="true"
     stored="true"/>
    
  2. データのインデキシング
    次に「*_p」のダイナミックフィールドに対して緯度経度のデータを
    投入します。ここでは「point_p」というフィールドに対して
    東京駅、有楽町駅、銀座一丁目駅、京橋駅、大手町駅の
    緯度経度データをインデキシングしています。以下のinput.xmlを新たに作成し、
    その下のcurlコマンドでインデキシングしましょう。input.xml

    <add>
      <doc>
        <field name="id">東京駅</field>
        <field name="point_p">35.680777,139.766969</field>
      </doc>
      <doc>
         <field name="id">有楽町駅</field>
         <field name="point_p">35.67506,139.763312</field>
      </doc>
      <doc>
        <field name="id">銀座一丁目駅</field>
        <field name="point_p">35.674529,139.766777</field>
      </doc>
      <doc>
        <field name="id">京橋駅</field>
        <field name="point_p">35.676664,139.770092</field>
      </doc>
      <doc>
        <field name="id">大手町</field>
        <field name="point_p">35.684786,139.766065</field>
      </doc>
    </add>
    

    curlでインデキシング

     $ curl "http://localhost:8983/solr/collection1/upadte?commit=true" --data-binary @input.xml -H 'Content-type: text/xml; charset=utf-8'
    
  3. 検索方法
    最後にクライアント側からインデキシングされたデータを検索します。
    今回は東京駅から1km圏内の位置情報を検索するというクエリを投げてみます。

    http://localhost:8983/solr/collection1/select?q=*:*&fq=%7B!geofilt%20sfield%3Dpoint_p%7D&pt=35.68096041340794,139.76710081100464&d=1 

    上手くいくと5件データがヒットするはずです。
    渡されたパラメータについて詳しく見ていくと以下のようになっています。

      q  *:* インデキシングされた全件検索を指定
      fq  {!geofilt sfield:point_p} 距離によるフィルタ、フィールドはpoint_pを使用
      pt  35.680??,139.767?? 検索の基準となる位置情報、緯度、経度をカンマ区切りで指定。
      d  1 検索の基準となるptパラメータの位置からこのパラメータに与えられた数値km範囲内の位置情報を検索

上記のようにSolrからは
非常に簡単に位置情報の検索ができるようになっています。
自社で位置情報をたくさん持っているというところがあれば
面白いサービスを提供できるかもしれません。

 

それではまた!

 

【12/10】 追記

位置情報検索を実施する上で設定が必要なフィールドが足りなかったため、「*_coordinate」のダイナミックフィールドの記述を追記しました。

 

 

 

 

 

 

 

【Curious Vehicle 第14回 勉強会ネタ】

『Solrを利用した画像検索について』 Part2

また2週間ほど空いてしまいました。お疲れ様です.makino です。

* 今回は先日の第11回 Solr勉強会でお話しさせていただいた『Solrを用いた画像検索システム』について継続して共有をさせていただきます。

* 今回は特徴情報をSolrのIndexデータとしてまとめる部分についてご説明いたします!

【解説】Solrで画像を検索するための3ステップ Part2
Solrによる画像検索-2 001

・Part1で行った画像データの特徴情報化だけでは情報量が多くまた計算量も増えてしまうため、『特徴情報のクラスタリングによるWORD化』を行います。

クラスタリングアルゴリズム:K平均法クラスタリング(K-means)

  • クラスタリングアルゴリズムとしてK平均法クラスタリングを簡単にご紹介します
  • K-means は 入力データを k個のクラスタに分類する単純な分類機アルゴリズムです
  • ランダムに振り分けたクラスタから各クラスタの重心を測定し、重心に近い座標で 再度重心計算とクラスタリングを繰り返すクラスタリング手法です

Solrによる画像検索-2 002

  • 上記の図はクラスタリング数を2として 重心計算を20回繰り返した結果を示しています

K平均法クラスタリングによるクラスタリング処理の流れ

  • 前回の復習も含め どのように動くか流れを見てみます!
    1. 解析用の画像を準備します

    Solrによる画像検索-2 003

      今回は画像の特徴量情報を検索軸として利用するため、色情報をカットします

    Solrによる画像検索-2 004

      SIFT特徴量アルゴリズムを実施し、特徴が検出された地点にプロットしています

    Solrによる画像検索-2 005

      K平均法クラスタリングを利用し画像の特徴情報のクラスタリングを行います

    Solrによる画像検索-2 006

      クラスタリング結果をヒストグラム化し、SolrのWORD情報として切り出します

    Solrによる画像検索-2 007

* これらのクラスタリング処理も検索画像すべてに実施します
* 勉強会の際はクラスタリング数を全画像100固定でクラスタリングを行っています
* この状態でやっとSolrに投入できる状態のデータが出来上がりましたので、『Solrによる画像情報の検索』へ進みたいと思います

Tips:Solr勉強会以降の進展について

その1:特徴量とクラスタリングの数のチューニングについて

  • 前回、特徴量の数に比例させk-meansによるクラスタ数を変化させるようなチューニングでは検索精度の向上という部分とは紐づかなかったと書かせていただきました
  • こちらの改善として精度向上が見られた点を共有したいと思います
  • Part1でのTipsにも書きましたが、検索精度が低い画像は総じて特徴情報の量が少ない傾向がありました。
  • 情報量が少ない画像は画像加工処理を追加し画像を回転させて再度特徴情報を取得することである程度安定した特徴量の抽出が行え、検索精度の高い向上が見られました
  • Sift特徴量のアルゴリズムでは、特徴が発生した座標やアングル情報を持っていますが今回の画像検索では汎用性という意味でこちらの情報を利用せず特徴情報のみで類似検出を行っているためこのような結果につながっていると思います
  • 用途が絞られるような画像検索であればもっとピンキーなチューニングにより精度向上が狙えると思うのですが、汎用性を踏まえ検証したところでは上記のようなチューニングで高い効果の確認ができました
  • 作業量の多そうな検証を省いたわけでなありません!たぶん!
【Curious Vehicle 第14回 勉強会ネタ】

『Solrを利用した画像検索について』

みなさまご無沙汰しております。makino です。

* 今回は先日の第11回 Solr勉強会でお話しさせていただいた『Solrを用いた画像検索システム』についてこちらで発表させていただきます!

* テキストデータの検索ツールであるSolrで画像検索も行えたら今までとは違うインターフェースやサービスを作れるのでは!?
* Solr勉強会で話をさせていただいた時よりも改善を加えていますのでお付き合いいただければと思います!

【解説】Solrで画像を検索するための3ステップ
Solrによる画像検索 001

・画像情報はそのままでは検索が行えないので、Solrが得意なテキスト形式に画像データを加工していきます。
・そのファーストステップとして、『画像の特徴情報の抽出』を行います。

特徴点抽出アルゴリズム:SIFT特徴点解析

  • まず特徴点抽出アルゴリズムとしてSIFTの概要をご紹介します
  • SIFTアルゴリズムは画像内の特徴点の検出を行い、座標やスケールなどの情報を応答として抽出します
  • SIFTでは各特徴点毎に以下の情報が取得できます
    1. x座標
      y座標
      スケール
      回転角度
      対応する128の記述子

SIFT特徴点解析による特徴点抽出の流れ

  • どのように動くか流れを見てみます!
  • Solr勉強会の際は、著作権的にNGな画像を多量に使ってしまいましたが、今回は弊社のロゴで許してください
    1. 解析用の画像を準備します

    Solrによる画像検索 002

      今回は画像の特徴量情報を検索軸として利用するため、色情報をカットします

    Solrによる画像検索 003

      SIFT特徴量アルゴリズムを実施し、特徴が検出された地点にプロットしています

    Solrによる画像検索 004

      特徴のベクトルをサークルの大きさで表示しています

    Solrによる画像検索 005

      実際は各特徴点ごとに以下のような情報が数値化されて取得できます

    Solrによる画像検索 006

* これらの解析処理を検索画像すべてに実施します
* この状態ではまだSolrのword情報(Term)としては少し情報が荒いため、『特徴情報のクラスタリングによるWord化』へ進みたいと思います
* 勉強会の際にお見せしたデモサイトも近いうちに公開したいと思います。よろしくお願いします!

Tips:Solr勉強会で質問いただいた点について
質問1:特徴量とクラスタリングの数のチューニングについて

  • 今回はクラスタリング数をを100固定としてしまいましたが、今回の検索精度を上げるための1番のチューニングポイントだったのでまず検証を進めました
  • 結果からとなりますが、特徴量の数に比例させk-meansによるクラスタ数を変化させましたが、検索精度の向上という部分とは紐づきませんでした
  • ただこちらを調べているうちに特徴点の数が画像によりだいぶ検出数が異なっていることを確認しこちらを改善することで検索精度の大きな向上が見られました
  • k-meansは計算量を減らすためのアプローチとして利用していますが、検索精度という意味でのアプローチではないため、DeepLearningや教師有り的なアルゴリズムへ次はチャレンジしようと思います

質問2:tf-idfにより画像の特徴がロストしてしまわないか

  • 画像の特徴から作り出したTerm情報の頻度分布を見てみましたが、小さい特徴の塊が6~7割の割合を占め大きな特徴情報がうまくロングテールとなり検索精度の向上に繋がっているように見られました

※ 質問いただいた方とは、先日のトレジャーデータさんの懇親会でまたお会いしました。まさかトレジャーの方だったとは

こんにちは、Curious Vehicle中鉢です。

前回はSolrCellを経由してHTMLの内容をインデキシングしてみました。

今回はその他いろいろなファイルをインデキシングしたり、

パラメータによってSolrへのインデキシングの内容を

制御したりしてみようと思います。

いろいろなファイルを読み込ませてみる

前回はHTMLファイルを読み込ませてみて

  • title
  • links
  • content-type
  • content
  • _version_
といった内容のデータが取れることがわかりました。
今回はそのほかのOffice、PDFといったファイルを読み込ませてみようと思います。
とりあえずはTikaのSupported Document Formatsのページから適当に
いくつかピックアップして読み込ませてみました。

はじめまして。Curious Vehicleの中鉢と申します。

本日よりCurious Vehicleの技術ブログを書くことになりました。

個人的に興味のあることや、いただいたお仕事を通じて

身に着けた技術、またハマった点などを

つらつらと書き綴っていこうかと思っています。

さて、本日は弊社でもコンサルティングを行っている

Apache Solrの一機能であるSolrCellについて

少し調べてみましたのでその調査内容なんぞを書いていきたいと考えています。

SolrCellとは

PDFやMSOffice文書のようなバイナリファイルや画像、音声のファイル等から

テキストデータ、メタデータなどを抽出しSolrのインデックスデータを作成、

更新する機能となります。

テキストデータの抽出にはApacheプロジェクトのTikaというソフトウェアを

利用しており、抽出できるファイルの種類もTikaのものに準じることになります。

※サポートしているフォーマットはTikaのサイトを参照ください。

http://tika.apache.org/1.2/formats.html

Read on »