デジタルカスタマーエクスペリエンスの向上
- Enterprise Search と Observability
鈴⽊ 章太郎
Elastic テクニカルプロダクトマーケティングマネージャー/エバンジェリスト
デジタル庁 省庁業務グループ ソリューションアーキテクト
Elastic
Technical Product Marketing
Manager/Evangelist
デジタル庁
省庁業務グループ
ソリューションアーキテクト
元 Microsoft Technical Evangelist
Twitter : @shosuz
Shotaro Suzuki
l なぜデジタルカスタマーエクスペリエンスが重要なのか
l Elastic アーキテクチャ、基本的な概念、クエリ
l Enterprise Search と Observability による
カスタマーエクスペリエンス向上
l まとめ
アジェンダ
なぜカスタマーエクスペリエンスが重要なのか
なぜカスタマーエクスペリエンスが重要なのか
新しい顧客を獲得する
お客様を逃さない
お客様をサポートする
新規顧客の開拓、ロイヤルティと信頼の構築、そして⽣涯顧客の維持に不可⽋
パフォーマンスの⾼い Web サイトやモバイルアプリを作る
遅い Web サイト、使い勝⼿の悪いモバイルアプリは、アクセス放棄、収益の損失、⼆度と戻ってこない訪問者につながる
Web サイトにたどり着いた後、
60%のユーザーは、求めている
情報が⾒つかるかどうかで、サイト
に留まるか、バウンスするかを判断
15秒ルール
Web サイトのパフォーマンスを維持する
ためには、リアルタイムで観測可能な
ツールが不可⽋
測定、監視、最適化
Web サイトやアプリ検索がビジネスの成⻑に貢献する3つの⽅法
顧客からの問い合わせと、それに対応した結果を結びつけることで、最適な Web サイト・モバイルアプリ体験を実現
閲覧⾏動をアドバンテージに
顧客維持率の向上
コスト削減、カスタマーサクセスとセルフサービスに投資し、顧客が望むものを提供する
Web サイトやモバイルアプリ検索の改善で考慮すべきこと
⽴ち上げに苦労せず、管理も簡単なものに細⼼の注意を払う
柔軟性のある既成のソリューションを利⽤する
コンテンツの取り込みを効率化
直感的な UI で絞り込み検索が可能
The Elasticsearch Platform
Enterprise Search Observability Security
Kibana
Explore, Visualize, Engage
Elasticsearch
Store, Search, Analyze
Integrations
Connect, Collect, Alert
Public cloud Hybrid On-premises
In a world where endless data creates endless possibility, search helps people and organizations thrive.
Elastic App Search
• Elastic App Search は Elastic のエンタープライズサーチソリューションの⼀部
• お客様の Web サイトやアプリケーションにパワフルでスケーラブルな検索体験を追加するのに
必要なすべてのツールを提供
Elastic Observability
• Web サイト、インフラ、アプリケーションのエコシステムを完全に理解するために、⼀元化されたツールセットによる
スケーラブルで包括的な監視システムを提供
• エコシステム全体の統⼀された可視性により、環境のあらゆる場所で発⽣するイベントを監視して対応し、
Web サイトのユーザーエクスペリエンスを向上
セキュリティを確保する
ためのプラットフォーム
Elastic Security は、エンドポイント
セキュリティと SIEM を統合して、
インフラ ストラクチャ全体での保護を
⼀元化するための予防、収集、検出、
および応答機能を提供します。
ELASTIC SECURITY
Endpoint SIEM
Elastic Security
Elastic アーキテクチャ、基本的な概念、クエリ
Elasticsearch の概念
- インデックス・ドキュメント・フィールド
• Elasticsearch は分散ドキュメント
ストア
• 保存されるデータの最⼩単位が
ドキュメント
• ドキュメントは、フィールドと呼ばれる
複数の属性を持つ
• インデックスはドキュメントの集合
Elasticsearch
の概念
具体例
SQL Server,
MySQL,
postgreSQL 等
インデックス
書籍データが格納
される場所
テーブル
ドキュメント 書籍データ レコード
フィールド
書籍タイトル、著者、
ISBN、出版⽇、等
カラム
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
• RESTful Web サービスの設計原則に従って設計
• HTTP メソッドを使って CRUD による⼀通りのドキュメント操作が可能
Elasticsearch for VSCode
https://marketplace.visualstudio.com/items?itemName=ria.elastic
http://user:pass@host:9200
https://elastic:RHGj80iJUO6CF7WBUMiwyu
1x@8009bf958b6w5923b3c56983d4048df
824.japaneast.azure.elastic-
cloud.com:9243
Books API からの書籍検索
Azure Static
Web Apps
Reactive
Search
検索専⽤ UI
ASP.NET 5
Web App,
(Blazor App)
Azure
Web Apps
Azure
SQL Database
Elastic Cloud
Azure サブスクリプション
Logstash
Azure
VM
(Linux)
検索・更新 UI
※ 今回は⼿動。同期⽅法例︓https://www.elastic.co/jp/blog/how-to-keep-elasticsearch-synchronized-with-a-relational-database-using-logstash
VSCode ※
東⽇本リージョン
マスターノード x 1
データノード x 2
ML ノード x 1
https://booksindex.azurewebsites.net/
https://f79...c67.japaneast.azure.elastic-cloud.com:9243/
APM SPA Agent
APM .NET Agent
https://brave-ocean-06f61b600.azurestaticapps.net/
Enterprise Search と Observability に
よるカスタマーエクスペリエンス向上
The Gallivant Web Shop
Architecture of The Gallivant Web Shop
Internet
Ship
metrics
& logs
End
user
Elastic Stack
Actions
Backend
micro services
Monitoring
Cart
Catalog
Ordering
Checkout
Search
React Client DevOps
Engineer
SecOps
Engineer
Marketer
…
End
user
Public Cloud
APIs
検索のない世界から App Search がある世界へ
Great
Search
コアテクノロジー コンテンツの格納 UI/UX
検索結果の
コントロール
No
Search
Elasticsearch
Search UI
検索結果
オートコンプリート
フィルター
ファセット機能
分析
関連性チューニング
検索の再現・テスト
Dashboard
Web Crawler
マイクロサービスアーキテクチャの採⽤はメリットも多いが、
同時に問題発⽣時の根本的な原因を⾒つけるのが難しくなる
Observability で解決できる主なビジネス課題
開発者、DevOps、
SRE の⽣産性
⾼い信頼性
コストパフォーマンスの
最適化
デジタルトランスフォーメーションの達成には新たなアプローチが不可⽋
クラウドネイティブアプリと
モノリシックなアプリの
⼀元管理
迅速な復旧
リリースや運⽤に関する
コストの最⼩化
顧客やビジネスに悪影響を及ぼす前に、異常をプロアクティブに検出、
特定できるソリューション – Observability の必要性
37%
変更
16%
移⾏
31%
コードのバグ
11%
セキュリティ
5%
アップグレード
出典 : EMA
アプリケーションのダウンタイムとパフォーマンス低下の原因トップ5
• Google クラウドコンソールで数回クリックす
るだけで、摩擦のないログの取り込み
• エージェントをインストールせずデータを
取り込む
エージェントベース(Beats、Elastic Agent)
とエージェントレスオプションの両⽅で柔軟性を
持たせる
• エージェントレス統合 :
- FireStore x App Search
- Pub/Sub
- Big Query
- Cloud Storage
Google Cloud
ネイティブデータ統合
https://qiita.com/shosuz/items/9e375fea6f5016e4fc8f
Firebase/Firestore ⽤ Elastic App Search 統合
https://www.elastic.co/jp/blog/accelerate-search-experiences-with-elastic-app-search-and-google-firebase
Google Firebase 拡張機能ディレクトリ
の Elastic App Search 拡張機能
Elastic App Search エンジン作成と
Firebase からのドキュメント受信の設定
https://firebase.google.com/products/extensions/firestore-elastic-app-search/
• アプリケーション内で効果的な検索
エクスペリエンスを構築することは困難
• ユーザーはストアで商品を検索する場合も、
サポートサイトの記事を検索する場合も、
会社のブログに投稿する場合も、迅速な
結果を期待
• 拡張機能を使⽤して⾼速でスケーラブルで
関連性の⾼い検索エクスペリエンスを
Firebase モバイルおよび Web ベースの
アプリケーションに簡単に組み込める
• アプリケーションに検索を追加するのに、
数回クリックするだけで開始できる
Kotlin x Firebase サンプルアプリ構成 (CQRS)
Cloud
Function
Firebase
Firestore
Elastic Cloud
プロジェクト
northeast1-b リージョン
マスターノード x 1
データノード x 2
ML ノード x 1
https://google-cloud-day-
digital-2021.es.asia-
northeast1.gcp.cloud.es.io
:9243
検索結果
全⽂検索クエリ
データ保存
Cloud Function で同期
VSCode
Android
Mobile App
Kotlin
Elastic
APM
Agent
Elastic
Search UI
React Web App
Elastic APM Agent
Firebase/Firestore ⽤ Elastic App Search 統合拡張機能
でノンコーディングで実現︕
App Search 内蔵の Reference UI で
Web 版 React アプリの雛形⾃動⽣成
Elastic エンタープライズサーチ
Azure x Elastic Deep Integration
Extend
Customer
Engagement
Grow Support
Build
Together
Evaluate
Requirements
運⽤を簡素化し、お客様の Azure 環境を最⼤限
に視覚化
• Azure 上のお客様のインフラストラクチャ、アプリ、
データの正常性、パフォーマンス、セキュリティを
監視する⽅法を効率化
• Azure portal 内で Elasticsearch の検索、
デプロイ、管理を簡単に⾏えるため、お客様が
必要なスピード、スケール、関連性を得られ、
お客様はビジネスに集中が可能
• Elastic on Azure でお客様のアプリや IT の検
索、分析、セキュリティを実現するには、こちらのソ
リューション ガイドをお読みください
Elastic
https://azure.microsoft.com/ja-jp/overview/linux-on-azure/elastic/#overview
• Spring Boot は Java アプリケーションで
最も使⽤されているフレームワーク
• Azure Spring Cloud という完全な
マネージドサービスが Marketplace で提供
• Elastic ユーザーは Azure Spring Cloud
から Elastic Cloud にシステム、コンソール、
およびアプリケーションログを取り込める
• Spring Boot アプリで発⽣する問題を継続
的に監視およびデバッグできる
Azure Spring Cloud
ログとの統合
https://docs.microsoft.com/ja-jp/azure/spring-
cloud/how-to-elastic-diagnostic-settings
• AWS サーバーレスアプリケーションリポジトリ (SAR) で公開
された新しい AWS Lambda アプリケーション (ベータ版)
を使⽤すると、ユーザーは仮想マシンのプロビジョニングやデータ
シッパーのインストールのオーバーヘッドなしに、アーキテクチャを
簡素化し、データの取り込みを合理化できます。
• ユーザーは AWS コンソール内から数回クリックするだけで
Amazon S3 から Elastic Cloud デプロイメントにログを
取り込むことができるようになりました。
AWS Serverless Application Repository (SAR)
エージェントレスログ発送⽤の FireLens
https://aws.amazon.com/jp/serverless/serverlessrepo/
https://www.elastic.co/jp/blog/elastic-and-aws-serverless-application-repository-speed-time-to-actionable-insights-with-frictionless-log-ingestion-from-amazon-s3
新しい Elastic と Amazon S3 Storage Lens の統合
管理を簡素化し、コストを管理し、リスクを軽減
https://www.elastic.co/jp/blog/new-elastic-and-amazon-s3-storage-lens-integration-simplify-management-control-costs-and-reduce-risk
• 新しい Elastic と Amazon Simple Storage Service(Amazon S3)ストレージレンズの統合により、お客様は、他の AWS
およびオンプレミスのデータセットとともに、Amazon S3 の使⽤状況とアクティビティの指標を組織全体で完全に把握できます。
• SRE と DevOps のエンジニアは、Elastic Search プラットフォームの強⼒な検索および分析機能(ダッシュボード機能、組み込みの
機械学習分析、しきい値ベースのアラートなど)を使⽤して、Amazon S3 Storage Lens のデータと環境全体の他のパフォーマンス
指標との関連付けやトレンドの特定を⾏うことができるようになりました。また、これらの知⾒は、アクセス頻度の低いオブジェクトを特定し、
より安価なストレージに移⾏することで、ストレージコストを最適化するために活⽤することができます。
まとめ
まとめ
l なぜデジタルカスタマーエクスペリエンスが重要なのか
l Elastic 概要
l Enterprise Search と Observability によるカスタマーエクスペリエンス
向上
Elastic 8.0 リリースのご紹介︓
スピード、スケール、関連性、シンプルさの新時代 (2/24)
https://www.elastic.co/jp/virtual-events/whats-new-in-elastic-8-0
Elastic 8.0 ベクトル検索機能の強化、最新の⾃然⾔語処理モデルのネイティブサポート、
簡素化されたデータオンボーディング、合理化されたセキュリティエクスペリエンスなど、
Elastic 8.0の新機能とアップデートについてご紹介します︕ 是⾮ご参加ください。
Elastic はオープンでフリーな超⾼速検索エンジンとデータの出⼊⼒インターフェースから構成され、あらゆるパブリッククラウドにデプロイできる、業界をリードする検索・分析プラットフォームです。
Elastic により企業や個⼈は魅⼒的な顧客 Web サイト体験やモバイルアプリ体験を提供できます。このセッションでは、Elastic による実装をサンプルアプリのデモを交えながらご紹介してい
きます。
デジタルイノベーション2022 オンライン (3/10)
https://ers.nikkeibp.co.jp/user/contents/2022w0307dionl/index.html#A_A-441B
Elastic Enterprise Search と Observability によるデジタルカスタマーエクスペリエンスの向上
Observability Conference 2022 Co-located Events Hands-on
https://event.cloudnativedays.jp/o11y2022/hands-on
Elastic ソリューションアーキテクト
による本イベント連携ハンズオン
ワークショップ開催 (前⽇)︕
(3/10 14:00-18:00)
URL:
https://event.cloudnativedays.jp/o11y
2022/hands-on
Elastic リソース
• 公式ドキュメント
https://www.elastic.co/guide/index.html
• デジタルカスタマーエクスペリエンスの向上
• DevOps ライフサイクルの進化
• 制限のないセキュリティ
• クラウドネイティブ アプリでの Elasticsearch
https://docs.microsoft.com/ja-jp/dotnet/architecture/cloud-
native/elastic-search-in-azure
• Elastic APM Agent
https://www.elastic.co/guide/en/apm/agent/index.html
• Azure での検索データ ストアの選択
https://docs.microsoft.com/ja-jp/azure/architecture/data-
guide/technology-choices/search-options
• Elastic APM
https://www.elastic.co/jp/apm/
• Configuration on .NET Core
https://www.elastic.co/guide/en/apm/agent/dotnet/current/co
nfiguration-on-asp-net-core.html
• ASP.NET Core Quick Start
https://www.elastic.co/guide/en/apm/agent/dotnet/current/set
up-asp-net-core.html
Elastic リソース
公式ドキュメント
https://www.elastic.co/guide/index.html
Elastic APM Agent
https://www.elastic.co/guide/en/apm/agent/index.html
Reactivesearch
https://opensource.appbase.io/reactivesearch/
優れた React 検索エクスペリエンスを迅速に構築する⽅法
https://www.elastic.co/jp/blog/how-to-build-great-react-search-experiences-quickly
GKE サンプルソリューション GitHub レポジトリ
https://github.com/michaelhyatt/k8s-o11y-workshop
関連ブログ
https://www.elastic.co/jp/blog/kubernetes-observability-tutorial-k8s-cluster-setup-demo-app-deployment
https://www.elastic.co/blog/kubernetes-observability-tutorial-k8s-log-monitoring-and-analysis-elastic-stack
https://www.elastic.co/blog/kubernetes-observability-tutorial-k8s-metrics-collection-and-analysis
https://www.elastic.co/blog/kubernetes-observability-tutorial-k8s-monitoring-application-performance-with-
elastic-apm
Thank you for your attention!
Appendix
(参考)
Logstash による
Elasticsearch へのドキュメント⼀括挿⼊
Logstash による Elasticsearch へのドキュメント⼀括挿⼊
https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017
sqlazuredb.conf という名前で作る
Logstash インストール(macOS の場合)
// brew の更新
brew update
// Elasticsearch インストール
brew install elasticsearch
// サービスを⼀覧表⽰したり、サービス(Elastic など)起動もできる
brew services list
brew services start elasticsearch
//Elastic が正常にインストールされたら、Logstash をインストール
//このタスクを達成するために必要なのは、別の brew コマンドだけ
brew install logstash
//インストールが終わったら同じくサービス起動
brew services start logstash
Azure SQL Database ⽤設定ファイル(logstash.conf)のコード例 (1)
"jdbc:sqlserver://hostname.database.windows.net:1433;
database=AdventureWorksLT;encrypt=true; hostNameInCertificate=*.database.windows.net"
”<username>@hostname"
”<password>"
/Users/(username)/Documents/sqljdbc_8.4/jpn/mssql-jdbc-8.4.1.jre8.jar"
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
"Select * from [SalesLT].[Customer]"
sqlazuredb.conf
com.microsoft.sqlserver.jdbc.SQLServerDriver
Azure SQL Database ⽤設定ファイル(logstash.confB)のコード例 (2)
sqlazuredb.conf
filter{}
output
{
stdout{
codec=>json_lines
}
elasticsearch{
cloud_id
=>":bynGyXZ6lYXN0LmF6dXJlLmVs8w867943534egGKh6GBZXQITdk34XN0aWMtY2xvdWQuY29tOjkyN…DMkNzA==="
cloud_auth => "elastic:pHkMI91iGYZ4DG9KCVNjxn2y”
index=>"customer1"
}
}
Logstash によるデータ取得と
Kibana によるインデックスパターン作成・データの表⽰
Elasticsearch CRUD 処理
新しいドキュメントの作成 -1
PUT booksbasic/_doc/1
{
"id": "1",
"title": ”Elastic ⼊⾨",
"date":"Oct 1, 2020",
"isbn": "ISBN123-4-56789-101-1",
"author":{
"first_name": ”Shotaro",
"last_name": ”Suzuki"
}
}
•
•
•
•
•
新しいドキュメントの作成 -2
“title”: ”Elastic ⼊⾨ - Elasticsearch/Kibana/Logstash/Beats”
“title”: ”Elastic & ASP.NET Core 3.x プログラミング”
“title”: ”Elastic による AKS Log/Metric/APM 管理”
“title”: ”Visual Studio Code による Elasticsearch プログラミング”
“title”: ”Elastic Logstash/Beats 開発と管理 徹底解説”
•
•
ドキュメントの取得 - 1
•
•
(結果)
{
"_index": "books",
"_type": "_doc",
"_id": "1",
"_version": 2,
"_seq_no": 5,
"_primary_term": 1,
"found": true,
"_source": {
"title": "Elastic ⼊⾨",
"date": "Oct 21, 2020",
"isbn": "ISBN123-4-56789-101-1",
"author": {
"first_name": ”Shotaro",
"last_name": "Suzuki"
}
}
}
GET booksbasic/_doc/1/
ドキュメントの取得 – 2 _source のみ
•
•
(結果)
{
"title": "Elastic ⼊⾨",
"date": "Oct 21, 2020",
"isbn": "ISBN123-4-56789-101-1",
"author": {
"first_name": "Shotaro",
"last_name": "Suzuki"
}
}
GET booksbasic/_doc/1/_source
ドキュメントの検索 – 1 全てのデータを検索
•
•
•
took – Elasticsearchが検索を実⾏するのにミリ秒単位の時間
timed_out –検索がタイムアウトしたかどうかを⽰します
_shards –検索されたシャードの数と、検索されたシャードの成功/失敗の数を⽰す
hits –検索結果
hits.total –検索条件に⼀致するドキュメントの総数
hits.hits –検索結果の実際の配列(デフォルトは最初の10ドキュメント)
hits.sort -結果のソートキー(スコアでソートする場合は⽋落)
POST booksbasic/_doc/_search
{
”query": {
“match_all” : {}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
ドキュメントの検索 – 2 シャードとは
•
•
•
•
• コンテンツボリュームを⽔平に分割/スケーリングすることが可能
• シャード間(場合によっては複数のノード上)で操作を分散および並列化できるため パフォーマン
ス/スループットが向上
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
ドキュメントの特定のデータの検索 – クエリ DSL とは︖
•
•
POST booksbasic/_doc/_search
{
"query": {
"match" : {
"title" : ”Elastic"
}
}
}
Elasticsearch データをクエリする⽅法はたくさんあります。詳細についてはこちら。
https://www.elastic.co/guide/en/elasticsearch/guide/current/_most_important_queries.html
ドキュメントの更新 - 1(データの変更)
•
POST booksbasic/_doc/1/_update
{
"doc": {
"title": "Elastic ⼊⾨ -
Elasticsearch/Kibana/Logstash/Beats"
}
}
GET booksbasic/_doc/1
{
"title": "Elastic ⼊⾨ –
Elasticsearch/Kibana/Logstash/Beats",
"date": "Oct 21, 2020",
"author": {
"first_name": "Taro",
"last_name": "Sato"
}
}
ドキュメントの削除(データの削除)
•
•
DELETE booksbasic
DELETE booksbasic/_doc/3
ASP.NET Core x NEST
新しい ASP.NET Core Web アプリ作成
dotnet new mvc
Model の作成
• Elasticsearch のデータ
から JSON にシリアライズ
のため必要
• Book という名のクラスを
追加
public class Book
{
public string Title { get; set; }
public string Isbn { get; set; }
public int PageCount { get; set; }
public string ThumbnailUrl { get; set; }
public string ShortDescription { get; set; }
public string LongDescription { get; set; }
public string Status { get; set; }
public string Authors { get; set; }
public string Categories { get; set; }
}
Elasticsearch への接続を作成
• NEST ライブラリ追加
• Program.cs への追加
dotnet add package NEST
using Elasticsearch.Net;
using Nest;
using Elastic.Apm.NetCoreAll;
===
var pool = new SingleNodeConnectionPool
//ローカル実⾏の場合
(new Uri(“http://localhost:9200”));
var settings = new ConnectionSettings(pool)
.DefaultIndex("books");
var client = new ElasticClient(settings);
services.AddSingleton(client);
---
//Elastic APM 追加
app.UseAllElasticApm(builder.Configuration);
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
---
Elasticsearch への接続を作成 - Elastic Cloud ⽤
•
var pool = new SingleNodeConnectionPool
(new Uri(http://localhost:9200/));
// Elastic Cloud デプロイ時に取得した値3つ (例)
https://elastic:oRHGj80iJUO6CF7WBUMiwyu1x@8009bf958
b6w5923b3c56983d4048df824.japaneast.azure.elastic-
cloud.com:9243
Search ⽤の HTML を作成 (index.cshtml 編集)
@model Nest.ISearchResponse<Book>
<form asp-controller="Home" asp-action="Index"
method="post">
<input type="text" name="query" />
<input type="submit" value="Search" />
</form>
@if (Model.Documents.Any())
{
<h3>検索結果</h3>
<ul>
@foreach (var book in Model.Documents)
{
<li>Title: @book.Title (ISBN:
@book.Isbn)</li>
}
</ul>
}
• @model を
[ISearchResponse]<Book>
に設定
• これは Elasticsearch 呼び出し
からの応答のタイプ
• 検索クエリをサーバーにポストバック
できる HTML フォームを追加
• Elasticsearch に渡して結果をレ
ンダリング
• ⼀致するドキュメントのタイトルと
ISBN をレンダリングする単純な
ループを追加
Elasticsearch クエリー ① MatchAll
•
•
private readonly ElasticClient _client;
public HomeController(ILogger<HomeController> logger, ElasticClient client)
{
_logger = logger;
_client = client;
}
public IActionResult Index()
{
var results = _client.Search<Book>(s => s
.Query(q => q
.MatchAll()
)
);
return View(results);
}
インデックス内の全てのドキュメントを返す
クエリ
≒ RDBMS の "SELECT *" クエリ
Elasticsearch クエリー ② Term
•
public IActionResult Index()
{
ISearchResponse<Book> results;
if (!string.IsNullOrWhiteSpace(query))
{
var results = _client.Search<Book>(s => s
.Query(q => q
.Term(t => t)
.Field(f => f.Isbn)
.Value(query)
)
)
);
}
else
{
.Query(q => q
.MatchAll()
)
);
…
⽤語クエリ
正確なクエリに⼀致するドキュメントを
⾒つける
Elasticsearch クエリー ③ Match
•
public IActionResult Index(string query)
{
ISearchResponse<Book> results;
if (!string.IsNullOrWhiteSpace(query))
{
results = _client.Search<Book>(s => s
.Query(q => q
.Match(t => t
.Field(f => f.Title)
.Query(query)
)
)
);
}
else
{
…
ユーザーにテキストを⼊⼒し、そのテキス
トをドキュメント内のコンテンツの任意の
部分と⼀致させる
[重要な点]
• 複数のドキュメントを照合
• すべての⼀致する⽂書には、タイトル
に、当該テキストが含まれる
• ⼩⽂字で指定したのにマッチする
• この動作はカスタムアナライザーで 上
書き可能
• これは別の⾼度なトピック
• Elasticsearch でサポートされる
クエリは他にも多数
• Term クエリと Match クエリは 基
本的ユースケース
Elasticsearch Aggregations ー 集計
Elasticsearch Aggregations ー 範囲集計
•
…
results = _client.Search<Book>(s => s
.Query(q => q
.MatchAll()
)
.Aggregations(a => a
.Range("pageCounts", r => r
.Field(f => f.PageCount)
.Ranges(r => r.From(0),
r => r.From(200).To(400),
r => r.From(400).To(600),
r => r.From(600)
)
)
…
[重要な点]
• MatchAll クエリに加えて、集計メソッ
ドを使⽤
• "範囲" 集計を指定
• Index.cshtml も編集必要
Elasticsearch Aggregations ー 条件集計
•
…
)
.Aggregations(a => a
.Range("pageCounts", r => r
.Field(f => f.PageCount)
.Ranges(r => r.From(0),
r => r.From(200).To(400),
r => r.From(400).To(600),
r => r.From(600)
)
)
.Terms("categories", t => t
.Field("categories.keyword")
)
)
…
• タグバブルやファセットUIシステム
のユースケース
• ⽤語集計
• ≒ RDBMS の“GROUP BY”句
• ドキュメント間でさまざまな単語(ま
たは「⽤語」)に関する統計を取
得可能
• Index.cshtml も編集必要
フィールド値が⽂字列 “categories.keyword” に
設定されているのは、⽤語の集計は負荷の⾼い操
作であり、通常は "text" フィールドでは実⾏されな
いため
Search ⽤の HTML を修正 (index.cshtml 編集)
@model Nest.ISearchResponse<Book>
<form asp-controller="Home" asp-action="Index" method="post">
<input type="text" name="query" />
<input type="submit" value="検索" />
</form>
@if (Model.Documents.Any())
{
<h3>検索結果</h3>
<ul>
@foreach (var book in Model.Documents)
{
<li>Title: @book.Title (ISBN:
@book.Isbn)</li>
}
</ul>
}
@if (Model.Aggregations != null)
{
<h3>集計</h3>
@if (Model.Aggregations.ContainsKey("pageCounts"))
{
<h4>ページ数 (範囲)</h4>
<ul>
@foreach (var bucket in
Model.Aggregations.Range("pageCounts").Buckets)
{
<li>@bucket.Key: @bucket.DocCount</li>
}
</ul>
}
@if (Model.Aggregations.ContainsKey("categories"))
{
<h4>カテゴリ (Terms)</h4>
<ul>
@foreach (var bucket in
Model.Aggregations.Terms("categories").Buckets)
{
<li>@bucket.Key: @bucket.DocCount</li>
}
</ul>
}
}
便利な機能のご紹介
- ReactiveSearch
ブートストラッププロジェクト
プロジェクトをスキャフォールディング
するために必要なステップ
● Elasticsearch クラスター作成
● データセットの取得
● データセットを Elasticsearch
にインポートする
● React プロジェクトの作成
● Reactive search インストール
● <ReactiveBase /> での
Elasticsearch への接続
<ReactiveBase
app="yelp"
url="YOUR_ELASTICSEARCH_CLUSTER_URL"
// 他のコンポーネントがこの中に配置される
<div>
Hello ReactiveSearch!
</div>
</ReactiveBase>
<DataSearch
componentId="SearchSensor"
dataField={["name", "name.search",
"name.autosuggest"]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
<DataSearch
componentId="SearchSensor"
dataField={[
"name",
"name.search",
"name.autosuggest",
"city",
"city.search",
"city.autosuggest"
]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
<DataSearch
componentId="SearchSensor"
dataField={[
"name",
"name.search",
"name.autosuggest",
"city",
"city.search",
"city.autosuggest"
]}
fieldWeights={[3, 1, 1, 2, 1, 1]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
<MultiList
componentId="CategorySensor"
dataField="categories.keyword"
/>
<ReactiveList
componentId="SearchResult"
react={{
and: ['CategorySensor’,
'SearchSensor'],
}}
renderItem={res =>
<div>{res.name}</div>}
/>
import { ReactiveOpenStreetMap } from
'@appbaseio/reactivemaps';
<ReactiveOpenStreetMap
componentId="SearchResult"
react={{
and: ['CategorySensor',
'SearchSensor'],
}}
dataField="location"
/>
<link rel="stylesheet”
href="https://cdnjs.cloudflare.com/ajax/libs
/leaflet/1.3.4/leaflet.css"/>
Elasticsearch への接続
<DataSearch /> サンプルコード
検索フィールドの追加
フィールド内の重み付け
<MultiList />サンプルコード
<ReactiveList /> サンプルコード
<ReactiveMap /> サンプルコード
Add Map Styles の追加
ReactiveSearch
実装例
ReactiveSearch インストール
yarn add @appbaseio/reactivesearch
https://docs.appbase.io/docs/reactivesearch/v3/overview/quickstart/
Elasticsearch への接続
<ReactiveBase
app="yelp"
url="YOUR_ELASTICSEARCH_CLUSTER_URL"
// 他のコンポーネントがこの中に配置される
<div>
Hello ReactiveSearch!
</div>
</ReactiveBase>
https://docs.appbase.io/docs/reactivesearch/v3/overview/quickstart/
Restaurant Search
<DataSearch
componentId="SearchSensor"
dataField={["name", "name.search",
"name.autosuggest"]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
<DataSearch /> サンプルコード
https://docs.appbase.io/docs/reactivesearch/v3/search/datasearch/
<DataSearch
componentId="SearchSensor"
dataField={[
"name",
"name.search",
"name.autosuggest",
"city",
"city.search",
"city.autosuggest"
]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
検索フィールドの追加
https://docs.appbase.io/docs/reactivesearch/v3/search/datasearch/
フィールド内の重み付け
https://docs.appbase.io/docs/reactivesearch/v3/search/datasearch/
<DataSearch
componentId="SearchSensor"
dataField={[
"name",
"name.search",
"name.autosuggest",
"city",
"city.search",
"city.autosuggest"
]}
fieldWeights={[3, 1, 1, 2, 1, 1]}
onValueSelected={(value, cause, source) => {
console.log("value", value);
console.log("source", source);
}}
/>
Restaurant Category Filter
<MultiList
componentId="CategorySensor"
dataField="categories.keyword"
/>
<MultiList />サンプルコード
https://docs.appbase.io/docs/reactivesearch/v3/search/multilist/
Restaurants Search Result
<ReactiveList /> サンプルコード
https://docs.appbase.io/docs/reactivesearch/v3/search/reactivelist/
<ReactiveList
componentId="SearchResult"
react={{
and: ['CategorySensor', 'SearchSensor'],
}}
renderItem={res => <div>{res.name}</div>}
/>
Restaurant Locations
ReactiveMap インストール
yarn add @appbaseio/reactivemaps
参考︓ renderalldata
https://docs.appbase.io/docs/reactivesearch/v3/map/reactiveopenstreetmap/
<ReactiveMap /> サンプルコード
https://docs.appbase.io/docs/reactivesearch/v3/map/reactiveopenstreetmap/
import { ReactiveOpenStreetMap } from
'@appbaseio/reactivemaps';
<ReactiveOpenStreetMap
componentId="SearchResult"
react={{
and: ['CategorySensor', 'SearchSensor'],
}}
dataField="location"
/>
Add Map Styles の追加
• OpenStreetMap / GoogleMaps を使⽤するには、インデックスにスタイルを
追加
• index.html またはコードベースにインポート可能
<link rel="stylesheet”
href="https://cdnjs.cloudflare.com/ajax/libs/
leaflet/1.3.4/leaflet.css"/>
他の事例
オンライン決済サービスの監視を⽀える Elastic Stack
ECサイト向けに様々な決済⼿段を提供 / 加盟店に決済画⾯は決済APIを提供するシステム(年間取引額2兆円、2億件以上のトランザクション)
https://www.elastic.co/jp/customers/softbank-payment-service
事例︓ソフトバンク・ペイメント・サービス株式会社
オンライン決済サービスの状況をほぼリアルタイムで可視化
• ダッシュボードで、成功した決済はグリーン、失敗したものはレッド、決済⼿段ごと
に OK/NG の⽐率の推移を俯瞰。「1. グリーンが急激に少なくなったら要注意。2.
レッドが急激に多くなったら要注意。」
• 誰でも、いつでも、どこでも、簡単に、サービスの状況を把握
• 障害以外でも、爆売れ、不正利⽤といった、加盟店の変化に気がつく
• エンジニアの決済トランザクションへの関⼼が⾼まる
Machine Learning で決済トランザクションの異常を検知
• 決済トランザクションの合計の⽇次の増減を3周期で学習し、それが予測した範囲
から⼤きく外れれば、異常として検出
• 可視化だけでは埋蔵してしまう変化を ML にて新たに発⾒
可視化をビジネスデータにまで広げる
• 2年分の売上推移を部署別・案件別に表現。ヒートマップで営業部⾨や個⼈の⽬標
達成率を表現。年間の加盟店契約の獲得状況を都道府県マップに表⽰
• サービスサイト閲覧状況を、アクセス元の IP アドレスから企業名を推定し、契約
済み企業からのアクセス、未契約企業からのアクセスランキングを作成
• ⾮エンジニアでもデータ投⼊からダッシュボードの作成までできる
事例︓株式会社リコー
すべてのログを Elastic Stack 上に集約。35 ノードで1 ⽇2TB のログを監視
「リコーグループ全システムの IT デバイスで発⽣する1 ⽇2 テラバイトにおよぶログが、すべて Elastic Stack に送り込まれます。これを35ノード、約400テラバ
イトのクラスターで処理します。インデックス数は約10,000 でサイズは約250 テラバイト。ドキュメント数は3,450 億にも及びますが、これは昨年12 ⽉の話で、
現在はさらに増えている状況です」と話す。Elastic Stack の製品については、Elasticsearch、Logstash、Kibana、Filebeat、Packetbeat、
Winlogbeat、Monitoring、Alerting 等が使⽤されており、特に⾒える化でキーとなる Kibana については、セキュリティ統括部のオフィス室内で、⼤型
モニターに常時チャートが表⽰され、担当者がシステムの状況をリアルタイムかつ直感的に把握できるようになっている。
https://www.elastic.co/jp/customers/ricoh
事例︓ブローダービズ株式会社
機械学習を駆使して時系列の映像データを解析。⾷品製造⼯場での作業を"⾒守り"、
異常⾏動発⽣をリアルタイムに検知してトラブルを回避
https://www.elastic.co/jp/customers/broaderbiz
⾷品偽装防⽌と働き⽅改⾰
課題
•⻑時間にわたる⼯場作業を、管理者の⽬のみによって監視し続
けることは容易ではない
•担当者は、制服、帽⼦、マスクを着⽤しているため、⾒た⽬だけ
では個⼈の特定が困難
•定量化された数値などによって状況を把握・記録することができ
ず、過去と照らし合わせることも困難
•録画されたビデオ映像は、問題が発⽣した後の証跡として利⽤
できるが、瞬時の対応には不向き
Solution
⼈⼿による作業を、AI を駆使したシステムによって“⾒守り”、担
当者の姿勢やある時間内での⾏動を、数値化された統計値との
⽐較し、通常の⾏動を逸脱した異常事態の発⽣を瞬時に判断
することで、トラブルの拡⼤を未然に防ぐという仕組みの実現。
NEDO(国⽴研究開発法⼈新エネルギー・産業技術総合開
発機構)の共同開発⽀援事業として認められた。
事例︓⽇本経済新聞社
⽇経電⼦版の記事検索およびログ解析の両⽅を1つの仕組みで実現
利⽤範囲の広さで Elasticsearch を採⽤
Elasticsearch を選定したのは、記事検索とログの可視化の両⽅に
使える利⽤範囲の広さが最⼤の理由
15台のクラスタ構成で、1秒あたり9000リクエスト以上という⾼い
性能を発揮
記事検索とログ解析に Elasticsearch を活⽤
⽇経電⼦版の記事は、5年分で約200万件、データサイズは5GB。記事の更新は、1⽇あたり数千回、ピーク時には1分間に300件程度の記事が更
新。検索における利⽤者からのアクセスは、1秒あたり100回程度だが、1秒あたり数千回のアクセスも想定
ログ解析で Elasticsearch を利⽤した最⼤のメリットは、専⾨的な深い知識がなくてもログ解析が可能になること。Elasticsearch と Kibana を利⽤
したログ解析により、たとえば、記事検索のレスポンスにどれくらいの時間がかかっているかを容易に解析でき、アプリケーションのどこにボトルネックがあるのか、
改善するべき機能はどこなのかを迅速に把握できる
https://www.elastic.co/jp/customers/nikkei
“Elasticsearch と Kibana を活⽤することで、エンジニア秘伝の“タレ( shell 芸)”を使って可視化していたログ解析を URL や、画
像で即座に社内共有できるようになりました。これまではログ解析ができるエンジニアが2⼈しかいなかったのですが、Elasticsearch と
Kibana を利⽤することで、秘伝のタレが不要になり、ログ解析ができるエンジニアを6⼈以上に増やすことができましたようになりました。"
– 日本経済新聞社 デジタル編成局 編成部 梅崎裕利氏
事例︓スイス・ライフ
Elasticsearch が⽣み出す360°の顧客管理
Elasticsearch で1000万⼈の顧客データのインデックス作成から分析、パブリッシュまでリアルタイムに実⾏
スイス・ライフにおける課題
スイス・ライフは保険や資産管理サービスを⼿掛ける⼤⼿企業で、フランスでは個⼈向け保険商品を主⼒に⾼いシェアを持つ
スイス・ライフ・フランスの1000万⼈の顧客情報に対し、さまざまなフォーマットや、さまざまなタイプのユーザアクセスにより、データへの均質なアクセスを
維持することが難しくなり、情報が「サイロ化」していた
Elasticsearchによる解決
スムーズな運⽤と、情報への均質なアクセスを実現させるため、スイス・ライフ・フランスは Elasticsearch で顧客データのインデックスとパブリッシュを⾏った
あらゆる顧客の窓⼝となる Web サイトとモバイルアプリケーションにデータを提供するため、まず Elasticsearch ですべての顧客データを1か所に集約
顧客記録、契約データ、マーケット分類データ、年⾦と保険スコアのすべての情報を横断してリアルタイムにクエリ。
すべての顧客がポータルサイトにアクセスでき、顧客情報と契約情報をすばやく取得できる機能を提供。また、情報が更新された場合、ソースシステムで
10秒以内にインデックスを作成。
https://www.elastic.co/jp/customers/swiss-life
“スピードと信頼性は不可⽋です。Elasticsearch がデータをリアルタイムにインデックスするようになり、すべてが進
化しました。"
– クリスチャン・ファン・チョン, スイス・ライフ・フランス、チーフエンタープライズアーキテクト
事例︓PSCU(⽶国有数の信⽤組合サービス組織)
Elastic は信⽤組合に対する数百万ドル相当の不正⾏為被害を防⽌することでリスク回避を実現
Elastic 製システムをデプロイしてからわずか18か⽉間で、3,500万ドルもの不正⾏為を阻⽌
PSCU における課題
PSCUは、⽶国有数の信⽤組合サービス組織で1,500の信⽤組合にサービスを提供し、年間38億件もの取引を扱う。
会員に対して⽀払い処理、リスク管理、データ分析、オンラインバンキング、モバイルプラットフォームなどさまざまな⾦融サービスを提供
年⽉が経つにつれデータベースが巨⼤化しデータ⼊⼒が困難になり、前⽇のデータを読み込むのに丸1⽇かかる状態で適切なタイミングで不正検知
ができていなかった。
Elasticsearch による解決
会員のオンラインログイン、IP アドレス、住所、サポートセンターへの問い合わせ履歴など、数多くのデータソースを Elasticsearch に集約しログを可視化
当初は内部の不正⾏為検知が⽬的であったが問題なく稼働したため、さらに全⽶1500の信⽤組合の外部からの不正⾏為を阻⽌できるよう、幅広い⾦
融関連データソースからのログを追加
機械学習を使⽤した不正検知を導⼊し導⼊後18ヶ⽉で3,500万ドルもの不正⾏為を阻⽌
単なる不正検知にとどまらず、災害発⽣時の地域で検知された平時と異なる⾏動(⾼価な発電機、⼤量の⽸詰などを突然購⼊するなど)をブロックしな
い機能なども追加
https://www.elastic.co/jp/customers/pscu
"Elastic Stackを構築したことで、不正⾏為を従来よりもはるかに簡単に検知できるようになりました。Elasticプラットフォームに⼊⼒
するデータベースを⼤幅に増やしたことで、従来は決して気付かなかったデータの特徴をとらえられるようになりました。現在では、発⽣中
の不正⾏為を検知できるだけでなく、発⽣前にそれを検知できるようになりました。"
– ジョナソン・ロビンソン氏, PSCU、不正インテリジェンス部門マネージャー
事例︓古野電気株式会社
船舶運航の安全・安⼼・効率化を⽀えるサービスを提供
データ・分析結果を得るまでの平均時間(MTTR)の短縮率 94%
差別化されたカスタマーエクスペリエンス
古野電気は、同社の Elastic オブザーバビリティソリューショ
ンの⼀部として Kibana と Elastic Maps を採⽤したこと
で、船上でのデータ使⽤に関するデータ・分析結果をより多
く得られるようになっています。それらのデータ・分析結果は、
お客様の船舶と陸上の接続コストとパフォーマンスの改善に
役⽴ちます。
コストパフォーマンスに優れたプロアクティブなサービスを提
供
今後発⽣しそうな機器の障害、予兆を検知し、予防保守
を⾏う必要があれば、修理内容を特定し、部品を迅速に⼿
配することで費⽤を抑えながら効果的な対応をご⽀援しま
す。
安全で効率的な航⾏を実現
古野電気は、Elastic Cloud の Elasticsearch
Service を活⽤することで、ライフサイクルソリューションを効
果的に多くのお客様へ展開することができます。また、お客
様のニーズにより最適なサービスプランをパッケージ化し販売
することで、安全で効率的な航⾏へ貢献します。
https://www.elastic.co/jp/customers/furuno

Developers-Summit-2022_Improving-Digital-Customer-Experience-with-Enterprise_SearchAndObservability-20220218