schemaを定義をやってみる

solrをちょっとずつ勉強し出して、今回で何回目の記事ですかね。前に書いた記事の続きになります。
前に書いた「SolrでCoreを作った後、jsonでのデータを入れて見た。」(https://webtopi.biz/archives/395)の続編。

何もschemaに定義しない状態でそのままデータを入力すると、各カラムというかフィールドが勝手に定義された状態で入力されるので、結果として思った検索結果を返さないようになりました。

本当だったら、fieldTypeをdefaultで用意してある「text_ja」で定義して入れるべきが、定義せずに入れたので、自動的に「text_general」に定義されたので、トークナイザが日本語にマッチした作動をしていないので、インデックスがおかしいというか。

なので、データを入れる前には、各フィールドをきっちり定義した上で入れましょうという話です。つまり、インデクシングの前処理をしっかりするということですね。

今回はschemaを定義する際、APIで定義を進行してみたのでメモを残しておきます。

タグとかついたデータをサンプルに定義したいと思うので、今回はcookpadのレシピを例にして定義してみました。

cookpadのページを要素別に考えてみる

サンプルとして、「絶品!簡単でおいしいスイートポテト」(https://cookpad.com/recipe/4727676)をベースに考えてみます。選んだ理由は、すべての項目があるため(レシピによっては、このレシピの人気ランキングやつくれぴの人数などがない)です。

schemaで考えないといけないのは、各フィールドにおいて、インデックスを使うのか、複数要素なのか(multivalueなのか、つまり1ページに複数のタグがついてる、mysqlでは別テーブルで管理が必要なもの)などがあります。

fieldのおおまかな項目は以下のとおりです。

データを眺めてみると、項目に複数の値が含まれている場合があります。

これをmultivalueといいます。行に色をつけておきました。

今度は各項目がデータ上、どのような属性であるかを定義します。フィールド定義時の項目が以下になるので、以下の項目を上記フィールドに当てはめてみたいと思います。

フィールドを定義する際の項目一覧

フィールドを追加する際には、そのフィールドに関して、色々と定義をする必要があるので、その定義する必要のある項目が以下のとおり。

mysqlと近い部分があるものの、格納の際に分解するので、元データが出せないという特性から、storedがあったり、カラムに配列を入れることができたりと、そのあたりが微妙に違います。

name,type,indexed,stored,required,multivalued

レシピを例に上記の項目を当てはめてみる

今度は最初に作っておいたレシピの要素に対して、フィールドの項目をつけてみます。typeは、デフォルトにあったtypeをベースにつけておきます。

まず、検索する上で分割するトークナイズする必要のない部分は基本的にstringで、数値や時間に関しては、typeで決定します。となると、text系になるのは、titleとdescriptionになります。

indexing、つまり検索として使う部分はほとんど該当するかと思うのですが、適宜使う要素にチェックします。

requiredは、入力必須項目を指しますが、idやurl、titleは当然必須ですが他は別になくても登録できていいはずなので、チェックしません。

multivalueは、タグみたいなものが該当しますので、素材や、カテゴリにおけるランキングが該当するので、そのあたりにチェックいれます。

長いので、ひとまずこのへんで。

コメント