ElasticSearch で文書を検索をしてみる
ElasticSearch
で提供されている代表的な文書の検索機能には、全文検索クエリと Term ベースクエリがあります。全文検索クエリは、検索時のキーワードが含まれているるドキュメントを探し出すための検索クエリです。一方 Term ベースクエリは、検索時のキーワードが完全に一致するドキュメントを探し出すための検索クエリになります。
よくある検索エンジンのようにキーワードが含まれている WEB ページを探すというような用途では全文検索クエリが適していますが、ユニークなキー値のようなものをキーワードにして、そのキー値が割り当てられている文書を探すような用途では Term ベースクエリが適しています。全文検索クエリではあらかじめ文書が単語に分割されて、その単語に対して検索が行われますが、Term ベースクエリでは文書が単語に分割されず、キーワードと完全一致するかで検索されます。ユニークなキー値で検索を行う場合、そのキーワードの一部分ではなくすべてが完全に一致するドキュメントを検索しなければならないので、Term ベースクエリの方が適していることになります。
今日はこの全文検索クエリと Term ベースクエリについて、実際にインデックスを作りながら試していきたいと思います。
検証データを用意する
前提として、今回は以下のインデックスを使うものとします。$ curl -XPUT http://localhost:9200/samurai -H "Content-type: application/json" -d '{
"settings": {
"number_of_replicas": 0,
"number_of_shards": 1,
"analysis": {},
"refresh_interval": "1s"
},
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "keyword"
},
"description": {
"type": "text"
}
}
}
}
}'
このマッピングでは、name
フィールドは keyword
型、description
フィールドは text
型としています。
また、このインデックスには以下のドキュメントを入れておきます。$ curl -XPOST http://localhost:9200/_bulk -H "Content-type: application/json" -d '
{ "index": { "_index": "samurai", "_type": "_doc" } }
{ "name": "真田昌幸", "description": "甲斐国の武田信玄の家臣となり信濃先方衆となった地方領主真田氏の出自で、真田信之、真田幸村の父。" }
{ "index": { "_index": "samurai", "_type": "_doc" } }
{ "name": "真田信之", "description": "真田昌幸の長男。徳川家康の養女を妻としていたため関ヶ原の戦いでは東軍につき、江戸時代には松代藩藩主をつとめた。" }
{ "index": { "_index": "samurai", "_type": "_doc" } }
{ "name": "真田幸村", "description": "真田昌幸の次男。豊臣家臣の大谷吉継の娘を妻としていたため関ヶ原の戦いでは西軍につき、父真田昌幸とともに戦死した。" }
{ "index": { "_index": "samurai", "_type": "_doc" } }
{ "name": "石田三成", "description": "豊臣政権の五奉行の一人。秀吉の死後、徳川家康を倒すため決起するが、関ヶ原の戦いで敗れ、その後処刑された。" }
{ "index": { "_index": "samurai", "_type": "_doc" } }
{ "name": "徳川家康", "description": "豊臣秀吉の天下統一後に台頭した武将で、関ヶ原の戦いに勝利し、江戸幕府を開いた。" }
'
続きを読む
ElasticSearch
コメント (1) 2018/10/10 20:00:43
ElasticSearch 6.4.2 をさわってみた
データを全文検索するためのエンジンである ElasticSearch
を触っていきたいと思います。全文検索というと WEB ページや文書のキーワード検索として広く利用されていますが、最近では RDB への参照性能を改善するため、代替手段として使われる場面も多いようです。RDB から適切なタイミングでデータを同期してやる必要があるものの、複数のテーブルやデータベースから必要なデータのみを集約して参照させるという用途では、RDB よりもはるかに高速にアクセスでき、RDB とは切り離した擬似的な参照系として構築できる点が評価されているようです。
ElasticSearch
も他の分散システムと同じくノードを複数台用意したクラスター構成をとることができますが、今回は手始めということで、シングルノード構成での環境構築からやってみたいと思います。
ElasticSearch をインストールする
公式サイトのダウンロードページから ElasticSearch
の最新版をダウンロードします。現時点での最新版は 6.4.2
でした。Linux 向けには rpm パッケージが公開されていたので、これを使うことにします。
ダウンロードした rpm
パッケージをインストールします。# rpm -ivh elasticsearch-6.4.2.rpm
ElasticSearch
をインストールすると、/etc/elasticsearch/elasticsearch.yml
として設定ファイルが作られます。シングルノード構成の場合には特に elasticsearch.yml
を編集しなくても動くのですが、複数ノード構成でクラスターを組む場合には書き変えてやる必要があります。
インストールした ElasticSearch
は、systemctl start
コマンドから起動できます。
# systemctl start elasticsearch.service
また、自動起動を有効化する場合は systemctl enable
しておきましょう。# systemctl enable elasticsearch.service
続きを読む
ElasticSearch
コメント (0) 2018/10/09 20:05:50