SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Elasticsearchと対話Botによる対話型の検索システム

Elasticsearchを用いた日本語検索システムの実装

Elasticsearchと対話Botによる対話型の検索システム 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

登録用文書のテンプレート設定

 文書登録の前に、Elasticsearchでは文書を登録する際にあらかじめどのような形で登録するかを設定できるので、その設定を行っておきます。

リスト01 sample/docker/template/elastic_index_template.json
{
"order": 0,
  "template": "contents-*",
  "settings": {
    "index": {
      "number_of_shards": "1",
      "number_of_replicas": "0"
    }
  },
  "mappings": {
    "contents": {
      "_source": {
        "enabled": true
      },
      "_all": {
        "analyzer": "ja",
        "enabled": true
      },
      "properties": {
        "body_text": {
          "search_analyzer": "ja_synonym",
          "analyzer": "ja",
          "type": "string"
        }
      }
    }
  },
  "aliases": {

  }
}

 文書登録に関連する部分のみ説明します。

  • "template": "contents-*"」:登録する文書が「contents-」で始まる場合は今回のテンプレートを使用するという意味になります。
  • "properties"」:登録する文書のフォーマットを設定しています。今回は単純にするため"body_text"の要素しか持たない形にしました。文書登録の場合は用途によって異なりますが、登録日やキーワード、文書の種類を登録しておくと、検索の際のバリエーションを増やしたりピンポイントで文書を選んだりできるようになります。
  • "body_text"」:登録する文書を設定しています。
  • "search_analyzer"」:検索の時のみに使用する"analyzer"を前回の記事で設定した"ja_synonym"に指定しています。
  • "analyzer"」:文書登録の時に使用する"analyzer"を前回の記事で設定した"ja"に指定をしています。

文書登録から検索処理

 下記がElasticsearchをテストで起動させて文書登録用のテンプレートを反映させ、文書登録から文書の検索、登録された文書の確認までを行うスクリプトです。

リスト02 sample/docker/shell/elastic_search_setting.sh
#!/bin/bash
略
# -- Body ---------------------------------------------------------
#  SCRIPT LOGIC GOES HERE
ROOT_DIR=`pwd`

# Elasticsearchの起動
sudo /etc/init.d/elasticsearch start &
sleep 10s
# 文書登録用テンプレートの反映
curl -XPUT localhost:9200/_template/contents --data-binary \
     "@config/elastic_index_template.json"
sleep 10s
echo Register
# 文書登録処理
curl -X POST http://localhost:9200/contents-20160111/contents/1  -d '
{
    "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。"
}
'
sleep 1s
echo Search
# 文書検索処理
curl -XGET 'localhost:9200/contents-20160111/contents/_search?pretty' -d'
{
 "query":{"match":{"body_text":"環境"}}
}'
# 登録された文書の確認
curl 'localhost:9200/_cat/indices?v'
# -----------------------------------------------------------------

 上記のスクリプトで"環境"を含むテキストを保存して検索処理を行っています。下記でスクリプトを実行します。sudoを使用しているため、パスワードを求められた際にe_passと入力してください。

sh shell/elastic_search_setting.sh

 上記のスクリプトの実行結果が下記になります。

補足

 通常の設定だと権限の関係で今回の設定で動作できないため、elasticsearchの動作用ファイルのstartの実行時に"--security.manager.enabled false"を指定するようにしています。セキュリティ上は問題がありますが、通常動作させることを優先したため下記のような対応になっています。

[ ok ] Starting Elasticsearch Server:.
略
{"_index":"contents-20160111","_type":"contents","_id":"1","_version":1,"_shards":{"total":1,"successful":1,"failed":0},"created":true}Search
{
  "took" : 102,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.095891505,
    "hits" : [ {
      "_index" : "contents-20160111",
      "_type" : "contents",
      "_id" : "1",
      "_score" : 0.095891505,
      "_source" : {
        "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。"
      }
    } ]
  }
}
health status index             pri rep docs.count docs.deleted store.size pri.store.size
green  open   contents-20160111   1   0          1            0       3.2kb         3.2kb

登録用のクエリについて

curl -X POST http://localhost:9200/contents-2016/contents/1  -d '
{
    "body_text" : "今回、作成したUbuntuでのDocker環境の構築方法です。"
}'
  • curl」:POST処理で文書を登録しています。
  • http://localhost:9200/contents-20160111/contents/1」:localhostに立てたElasticsearchはポート番号9200を開いているので、そこに「インデックス名:"contents-20160111"、タイプ名:"contents"、登録文書id:"1"」で登録しています。
  • "body_text"」:ここで登録用の文書を設定しています。

検索用のクエリについて

curl -XGET 'localhost:9200/contents-20160111/contents/_search?pretty' -d'
{
 "query":{"match":{"body_text":"環境"}}
}'
  • curl」:GET処理で文書を検索しています。
  • "body_text"」:ここを変更することで、どのような文字列とマッチしたいかを指定できます。複数項目を登録している場合は、"body_text"部分を変更して検索対象の変更が行えます。

 文書の検索には手法としてクエリとフィルターがあります。単純なマッチングでは上記のようなクエリを使用しますが、範囲を絞りたいなどのニーズがあればフィルターの方が手法としては適切です。クエリとフィルターを組み合わせる高度な手法もあります。

次のページ
大量の文書を登録して検索する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Elasticsearchと対話Botによる対話型の検索システム連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 大串 正矢(オオグシ マサヤ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9748 2016/10/31 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング