はじめに
こんにちはrilmayerです。
この記事はアドベントカレンダー「Search&Discovery 全部俺」13日目の記事となります。
有名なOSSの全文検索エンジンであるSolrの紹介をしたいと思います。
最低限の簡単な操作方法を紹介していきます。
前回の記事で紹介した全体像のうちの検索エンジンの一例です。
#Solrとは?
オープンソースの検索エンジンです。
使い勝手がよく、大規模な検索サービスを提供している会社でもよく使われています。
検索エンジンとしての基本的な操作を試してみる
Solrインストールと立ち上げ
本来は、本番での運用を見据えたMaster/Slave構成などがとても便利なのですが、今回は簡単な利用方法のみの紹介となります。
公式のチュートリアルはファイルをダウンロードして展開という感じでしたが、やはりDockerが楽なのでDockerイメージで立ち上げてみます。
# image pull
docker pull solr:8
# docker run
# 中に入る場合、以下のコマンドでSolr起動
# solr-foreground
docker run -it -p 8983:8983 solr:8 bash
# デーモンとして起動する場合
docker run -d -p 8983:8983 --name my_solr solr:8
ということで、 http://localhost:8983/ にアクセスすると以下のようなコンソールにアクセスできます。
coreの作成・データの投入・検索
Solrではcore(今回の場合はデータベースのテーブルに相当)をまずはじめに作成する必要があります。
すでにdockerイメージをデーモンとして起動している場合Dockerコマンド経由でsolrコマンドを使うとcoreを作成できます。
昨日の記事と同様、サンプルとしてアイドル検索をやってみます。
# core作成
docker exec -it my_solr solr create_core -c my_favorite_idols
以降はREST API経由でSolrを操作できるので、そんな感じで操作していきます。
今回は操作スクリプトをPythonで書いてみました。
スキーマ定義
「アイドル名」と「アイドルの説明」の2つのフィールドを用意した以下のようなスキーマを定義します。
name | type | stored | indexed | multivalued |
---|---|---|---|---|
idol_name | string | true | true | false |
description | text_ja | true | true | false |
import requests
import json
# スキーマ定義
base_url = 'http://localhost:8983/solr'
url = base_url + '/my_favorite_idols/schema'
field_setting = {
"add-field": [
{
"name": "idol_name",
"type": "string",
"stored": True,
"indexed": True,
"multiValued": False,
},
{
"name": "description",
"type": "text_ja",
"stored": True,
"indexed": True,
"multiValued": False,
}
]
}
headers = {'content-type': 'application/json'}
res = requests.post(url, data=json.dumps(field_setting), headers=headers)
データの追加
# descriptionはwikipediaの該当ページから拝借
# https://ja.wikipedia.org/wiki/AmiinA
# https://ja.wikipedia.org/wiki/%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB%E3%83%BB
# https://ja.wikipedia.org/wiki/%E3%83%A4%E3%81%AA%E3%81%93%E3%81%A8%E3%81%9D%E3%81%A3%E3%81%A8%E3%83%9F%E3%83%A5%E3%83%BC%E3%83%88
# https://ja.wikipedia.org/wiki/BEYOOOOONDS
# https://ja.wikipedia.org/wiki/TipToe.
payload = [
{
"idol_name": "amiinA",
"description": '雑誌「ニコ☆プチ」の読者モデルであった[1]amiと、miinaの2人で「 あみいな」を結成。「あみいな」は2人の名前「あみ」と「みいな」を掛け合わせたもの。\n\n2012年8月、当時同じ事務所のMYM Melodyが出演するイベントで初披露。\n\n結成当初は、ももいろクローバーZやAKB48などのカバーだったが、オリジナル曲を作る際にプロデューサーとして楽曲クリエイティブチーム・nanolineの齊藤州一が加わる[2]。\n\n2013年8月、初のシングル「1☆2☆3☆/マインドトラベル」を発売。アーティスト表記をアルファベットの「amiina」とする。\n\n2014年4月に吉田豪が「With you」(bayfm)[3]で、5月に南波一海がインターネット放送「南波一海のアイドル三十六房」[4]で「マインドトラベル」を紹介したことから、その頃から音楽に詳しいアイドルファンから反応が来るようになり、齊藤は「音楽的に自由に攻めてもいいのではないか」と思うようになったと語っている[5]。\n\n2016年2月13日のLIVEをもってmiinaが脱退[6]、活動休止となる。\n\n2016年3月22日、スタッフのTwitterで、表記を「amiinA」に変更し、新メンバーを加え活動を再開することを発表[7]。 5月3日、渋谷WWWで開催された「WonderTraveller!!! act.4」で、新メンバーmiyuが加入し、amiinAとして再始動[8]。\n\n2016年12月28日のライブをもち、miyuの高校受験のため活動を一時休止[9]。\n\n2017年4月15日よりライブ活動を再開[10]。\n\n新生amiinAは、「awake mind into ideal naked Avalon」の略。\n'
},
{
"idol_name": "・・・・・・・・・",
"description": '2016年4月に開催された「『女の子の東京をつくろう!!』プロジェクト アイドルオーディション」で選ばれたメンバーによるユニット[1][2]。\n\nコンセプトは「ポスト・ポケモンGO!時代のアイドル」「常に纏える(まとえる)アイドル」[3]「都市の幽霊」[4]。\n\n名前や顔を出さない、シューゲイザーやアンダーグラウンド・パンクなどを踏襲した楽曲、テクノロジーを用いた全く新しいアイドル活動などを特徴とする。\n\nライブのことを「観測」、ファンのことを「観測員」と呼ぶ。\n\nライブ中は写真撮影可能、動画撮影不可[5]。\n'
},
{
"idol_name": "ヤなことそっとミュート",
"description": 'BELLRING少女ハート→There There Theresの運営を手掛けたクリムゾン印刷による新アイドルプロジェクト。ただし、BELLRING少女ハートディレクターの田中紘治およびAqbiRecは運営には関与せず[1]、エンジニアの慎秀範(DCG代表)と林惇太、作曲家・アレンジャーのタニヤマヒロアキ(2019年離脱[注 1])からなるチーム「DCG ENTERTAINMENT」がプロデュースを担っている[2]。\n\nコンセプトは「ヤなことだらけの日常をそっとミュートしても何も解決しないんだけど、とりあえずロックサウンドに切ないメロディーを乗せて歌ってみる事にする。」[3]。グランジやシューゲイザーといったオルタナティブ・ロックを主体とする。なお、タニヤマはヤナミューではマネージメントとパフォーマンスを主に担当[2]していたため、本職である作曲・編曲はオープニングSEの「ヤなことFriday」以外手がけていない。\n\nライブ中の写真撮影・動画撮影は原則として可能。リフト、ダイブ、サーフといった"人の上に乗る行為"は2017年4月29日以降禁止。\n'
},
{
"idol_name": "BEYOOOOONDS",
"description": 'ハロプロ研修生から選ばれたメンバーで結成されたユニット、CHICA#TETSU(チカ#テツ)、雨ノ森 川海(あめのもり かわうみ)、および『ハロー!プロジェクト“ONLY YOU”オーディション』合格者により構成される[1]。\n「〜を超えて」「〜の向こう側へ」という意味の英単語「Beyond」をグループ名の語源とし、既成の枠組などを超えて、自由に未来へ大きくビヨーンと伸びていってほしいという思いが込められている。形を変幻自在にビヨーンびよーんと変貌させる、スライムのようなグループを目指す[1]。\nBEYOOOOONDSのリーダーは、2018年12月現在、公式には発表されていない。\n'
},
{
"idol_name": "tipToe.",
"description": '制作プロダクション合同会社SOVAの社内プロジェクトとして立ち上がり、2016年夏に行ったオーディション[1] で一般から選ばれたメンバーで結成。「みんなで青春しませんか?」をコンセプトに掲げ、青春や学校をモチーフとした楽曲やヴィジュアルが持ち味。メンバーは3年任期制で加入から3年で必ず卒業することになっている。\n\n統括及び音楽プロデューサーは音楽レーベル6jomaProject主宰の本間翔太。映像や衣装などを担当するヴィジュアルプロデューサーは写真家の長谷川圭佑。楽曲や振付などに自身もアーティストとして活動する若手クリエイターを数多く起用することも特徴。\n\n楽曲は、渋谷系ギターポップをベースにエレクトロニカ・チップチューンの要素を盛り込んだ爽やかでエモーショナルなものが多い。\n\nグループ名は「少しだけ背伸びして、今よりも高い所に届くように」という思いを込めて「背伸びする」(=「つま先で立つ」)を意味する英語「stand on tiptoe」から[2]。\n'
},
]
# データのロード
url = base_url + '/my_favorite_idols/update?commit=true&indent=true'
headers = {'content-type': 'application/json'}
res = requests.post(url, data=json.dumps(payload), headers=headers)
データの検索
以下のようなコマンドで検索ができます。
# 検索
query = 'メンバー'
fields = ['description']
query_function = " AND ".join([f"{field}:{query}" for field in fields])
url = base_url + f"/my_favorite_idols/select?q={query_function}"
headers = {'content-type': 'application/json'}
res = requests.get(url, headers=headers)
results = json.loads(res.content)
# 結果表示
print('hit: ', results['response']['numFound'])
for i, result in enumerate(results['response']['docs']):
print(f"[{i}]",result['idol_name'], ': ', result['description'])
結果は以下のような感じ。
hit: 4
tipToe. : 制作プロダクション合同会社SOVAの社内プロジェクトとして立ち上がり、2016年夏に行ったオーディシ
・・・・・・・・・ : 2016年4月に開催された「『女の子の東京をつくろう!!』プロジェクト アイドルオーディション」で選
BEYOOOOONDS : ハロプロ研修生から選ばれたメンバーで結成されたユニット、CHICA#TETSU(チカ#テツ)、雨ノ森
amiinA : 雑誌「ニコ☆プチ」の読者モデルであった[1]amiと、miinaの2人で「 あみいな」を結成。「あ
おわりに
今回はsolrを検索サーバーとして使ってみるためのさわりを紹介してみました。
ここから実際の大規模なシステムとして運用していくのには大きなギャップがあるので注意が必要です。