Suche senden
Hochladen
Fess/Elasticsearchを使った業務で使える?全文検索への道
•
6 gefällt mir
•
12,030 views
Shinsuke Sugaya
Folgen
FessやElasticsearchを通して検索システムを作る際に遭遇する課題などを紹介します。
Weniger lesen
Mehr lesen
Technologie
Melden
Teilen
Melden
Teilen
1 von 77
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
Shinsuke Sugaya
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
Shinsuke Sugaya
社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウ
Shinsuke Sugaya
Elasticsearch勉強会#44 20210624
Elasticsearch勉強会#44 20210624
Tetsuya Sodo
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
S. T.
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Yahoo!デベロッパーネットワーク
Solr から使う OpenNLP の日本語固有表現抽出
Solr から使う OpenNLP の日本語固有表現抽出
Koji Sekiguchi
Empfohlen
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
Shinsuke Sugaya
Elasticsearchベースの全文検索システムFess
Elasticsearchベースの全文検索システムFess
Shinsuke Sugaya
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
Shinsuke Sugaya
社内ドキュメント検索システム構築のノウハウ
社内ドキュメント検索システム構築のノウハウ
Shinsuke Sugaya
Elasticsearch勉強会#44 20210624
Elasticsearch勉強会#44 20210624
Tetsuya Sodo
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
実践!Elasticsearch + Sudachi を用いた全文検索エンジン
S. T.
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Solrで多様なランキングモデルを活用するためのプラグイン開発 #SolrJP
Yahoo!デベロッパーネットワーク
Solr から使う OpenNLP の日本語固有表現抽出
Solr から使う OpenNLP の日本語固有表現抽出
Koji Sekiguchi
Apache Solr 入門
Apache Solr 入門
順平 西本
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
グラフデータベース入門
グラフデータベース入門
Masaya Dake
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
RESTfulとは
RESTfulとは
星影 月夜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Takahiko Ito
AWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi
第10回solr勉強会 solr cloudの導入事例
第10回solr勉強会 solr cloudの導入事例
Ken Hirose
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL Co., Ltd.
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
Renewed using elasticsearchonaspnet-core5
Renewed using elasticsearchonaspnet-core5
Shotaro Suzuki
Weitere ähnliche Inhalte
Was ist angesagt?
Apache Solr 入門
Apache Solr 入門
順平 西本
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
グラフデータベース入門
グラフデータベース入門
Masaya Dake
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Shinsuke Sugaya
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
Shinsuke Sugaya
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
Koichi Tanaka
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
Naruhiko Ogasawara
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
RESTfulとは
RESTfulとは
星影 月夜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Takahiko Ito
AWSではじめるMLOps
AWSではじめるMLOps
MariOhbuchi
第10回solr勉強会 solr cloudの導入事例
第10回solr勉強会 solr cloudの導入事例
Ken Hirose
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
Tetsutaro Watanabe
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
dcubeio
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL Co., Ltd.
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Amazon Web Services Japan
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Was ist angesagt?
(20)
Apache Solr 入門
Apache Solr 入門
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
グラフデータベース入門
グラフデータベース入門
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
Elasticsearchプラグインの作り方
Elasticsearchプラグインの作り方
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
RESTfulとは
RESTfulとは
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
AWSではじめるMLOps
AWSではじめるMLOps
第10回solr勉強会 solr cloudの導入事例
第10回solr勉強会 solr cloudの導入事例
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
LIFULL HOME'SでのSolrの構成と運用の変遷
LIFULL HOME'SでのSolrの構成と運用の変遷
PostgreSQLによるデータ分析ことはじめ
PostgreSQLによるデータ分析ことはじめ
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Ähnlich wie Fess/Elasticsearchを使った業務で使える?全文検索への道
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Shigeru Hanada
Renewed using elasticsearchonaspnet-core5
Renewed using elasticsearchonaspnet-core5
Shotaro Suzuki
Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127
Shotaro Suzuki
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa
Splunk 7.0の概要及び新機能
Splunk 7.0の概要及び新機能
Kunihiko Ikeyama
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
Shigeru Hanada
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Shinsuke Sugaya
What's New in the Elastic 8.4 Release
What's New in the Elastic 8.4 Release
Shotaro Suzuki
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
de:code 2017
Integrating elasticsearch with asp dot net core
Integrating elasticsearch with asp dot net core
Shotaro Suzuki
PostgreSQLをWatson Discoveryに接続する方法
PostgreSQLをWatson Discoveryに接続する方法
Kohei Nishikawa
20180922 jazug8 cosmosdb_search
20180922 jazug8 cosmosdb_search
Kazuhiro Wada
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
Atsuo Yamasaki
問合せ最適化インサイド
問合せ最適化インサイド
Takahiro Itagaki
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
stomita
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
Nao Minami
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Tasuku Otani
Azure Search クックブック
Azure Search クックブック
Kazuyuki Miyake
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
VirtualTech Japan Inc.
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版
Junichiro Tasaki
Ähnlich wie Fess/Elasticsearchを使った業務で使える?全文検索への道
(20)
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
Renewed using elasticsearchonaspnet-core5
Renewed using elasticsearchonaspnet-core5
Elastic circle ci-co-webinar-20210127
Elastic circle ci-co-webinar-20210127
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
Splunk 7.0の概要及び新機能
Splunk 7.0の概要及び新機能
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
What's New in the Elastic 8.4 Release
What's New in the Elastic 8.4 Release
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
[DI08] その情報うまく取り出せていますか? ~ 意外と簡単、Azure Search で短時間で検索精度と利便性を向上させるための方法
Integrating elasticsearch with asp dot net core
Integrating elasticsearch with asp dot net core
PostgreSQLをWatson Discoveryに接続する方法
PostgreSQLをWatson Discoveryに接続する方法
20180922 jazug8 cosmosdb_search
20180922 jazug8 cosmosdb_search
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
問合せ最適化インサイド
問合せ最適化インサイド
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Alfresco勉強会#33 alfresco 5.1でコンテンツ自動削除を実装してみた
Azure Search クックブック
Azure Search クックブック
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
AppExchangeパートナー&デベロッパー第2部:20070523版
AppExchangeパートナー&デベロッパー第2部:20070523版
Mehr von Shinsuke Sugaya
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
Shinsuke Sugaya
PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法
Shinsuke Sugaya
PredictionIOのPython対応計画
PredictionIOのPython対応計画
Shinsuke Sugaya
PredictionIO構築入門
PredictionIO構築入門
Shinsuke Sugaya
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
Shinsuke Sugaya
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステム
Shinsuke Sugaya
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch Authプラグインでアクセスコントロール
Shinsuke Sugaya
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成
Shinsuke Sugaya
DBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFess
Shinsuke Sugaya
elasticsearchプラグイン入門
elasticsearchプラグイン入門
Shinsuke Sugaya
Solrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ Fess
Shinsuke Sugaya
Sc2009autumn s2robot
Sc2009autumn s2robot
Shinsuke Sugaya
オフィスに1台!全文検索Fess
オフィスに1台!全文検索Fess
Shinsuke Sugaya
Mehr von Shinsuke Sugaya
(13)
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
PredictionIOでSparkMLを使った開発方法
PredictionIOでSparkMLを使った開発方法
PredictionIOのPython対応計画
PredictionIOのPython対応計画
PredictionIO構築入門
PredictionIO構築入門
Elasticsearchで作る形態素解析サーバ
Elasticsearchで作る形態素解析サーバ
ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作るレコメンドシステム
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch Authプラグインでアクセスコントロール
DBFlute Mavenプラグインを用いてCRUD作成
DBFlute Mavenプラグインを用いてCRUD作成
DBFluteを用いて開発されている全文検索システムFess
DBFluteを用いて開発されている全文検索システムFess
elasticsearchプラグイン入門
elasticsearchプラグイン入門
Solrベースの全文検索サーバ Fess
Solrベースの全文検索サーバ Fess
Sc2009autumn s2robot
Sc2009autumn s2robot
オフィスに1台!全文検索Fess
オフィスに1台!全文検索Fess
Fess/Elasticsearchを使った業務で使える?全文検索への道
1.
Fess/Elasticsearchを使った 業務で使える?全文検索への道 DBFluteフェス2017 1
2.
DBFluteフェス 2017 ■ 名前:
菅谷信介 ■ オープンソース活動: ➔ Fess, DBFlute関連, Apache PredictionIO,... ■ Blog: http://www.chazine.com/ ■ Twitter: https://twitter.com/shinsuke_sugaya/ ■ DBFluteフェスのこの枠で話すのは3回目… 自己紹介 2
3.
DBFluteフェス 2017 今日の本題 3
4.
DBFluteフェス 2017 今日は 全文検索システムを作るとは? を考えていきましょう 4
5.
DBFluteフェス 2017 その前に前提として… 5
6.
DBFluteフェス 2017 ■ OSSの分散リアルタイム検索&分析エンジン ■
特徴 ➔ドキュメント指向な検索エンジン(Apache Lucene) ➔RESTfulなAPI ➔スキーマフリー ➔分散システム (高可用性、スケールアウト) ➔プラグインによる拡張 ■ DBFlute的に使うならESFluteも ➔https://github.com/lastaflute/lastaflute-example-waterfront/ Elasticsearchとは 6
7.
DBFluteフェス 2017 ■ オープンソースの全文検索システム ➔オールインワンで簡単に利用可能 ■
Apacheライセンスで提供 ■ Elasticsearchを検索エンジンとして利用 ■ 現在の最新バージョンは11.4 ➔2009/09にSolrベースで1.0をリリース ■ 商用サポートも提供 (N2 Search) Fessとは 7 http://fess.codelibs.org/ja/
8.
DBFluteフェス 2017 さっそく 検索システムについて 考えていきましょう 8
9.
DBFluteフェス 2017 どんなクエリーを考えますか? 9 たとえば テスト
10.
DBFluteフェス 2017 こんな感じとか? 10 { "from": 0, "size":20, "query":
{ "match_phrase": { "content": "テスト" } } } 検索クエリー例1
11.
DBFluteフェス 2017 もうちょっとがんばってこんな感じとか? 11 { "from": 0, "size":
20, "query": { "bool": { "should": [ { "match_phrase": { "title": "テスト" } }, { "match_phrase": { "content": "テスト" } } ] } } } 検索クエリー例2
12.
DBFluteフェス 2017 世の中 そんなに あまくありません… 12
13.
DBFluteフェス 2017 { "from" :
0, "size" : 20, "timeout" : "10000ms", "query" : { "bool" : { "must" : [ { "function_score" : { "query" : { "bool" : { "should" : [ { "match_phrase" : { "title" : { "query" : "テスト", "slop" : 0, "boost" : 0.2 } } }, { "match_phrase" : { "content" : { "query" : "テスト", "slop" : 0, "boost" : 0.1 } } }, { "match_phrase" : { "title_ja" : { "query" : "テスト", "slop" : 0, "boost" : 1.0 } } }, { "match_phrase" : { "content_ja" : { "query" : "テスト", "slop" : 0, "boost" : 0.5 } } }, { "match_phrase" : { "title_en" : { "query" : "テスト", "slop" : 0, "boost" : 1.0 } } }, 13 { "match_phrase" : { "content_en" : { "query" : "テスト", "slop" : 0, "boost" : 0.5 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, "functions" : [ { "filter" : { "match_all" : { "boost" : 1.0 } }, "field_value_factor" : { "field" : "boost", "factor" : 1.0, "modifier" : "none" } } ], "score_mode" : "multiply", "max_boost" : 3.4028235E38, "boost" : 1.0 } } ], "filter" : [ { "bool" : { "should" : [ { "term" : { "role" : { "value" : "1guest", "boost" : 1.0 } } }, { "term" : { "role" : { "value" : "Rguest", "boost" : 1.0 } } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } } ], "disable_coord" : false, "adjust_pure_negative" : true, "boost" : 1.0 } }, ・ ・ ・ 実際にはもっと長い… Fessの検索クエリー
14.
DBFluteフェス 2017 まずは 検索の基礎から 振り返っていきましょう 14
15.
DBFluteフェス 2017 ■ 文字列を解析して、索引を作る ■
検索は索引から単語が含まれるIDリストを取得 転置インデックス 15 文書ID 文字列 1 東京スカイツリー 2 東京タワー 単語 文書IDリスト 東京 1, 2 スカイツリ 1 タワー 2
16.
DBFluteフェス 2017 ■ テキストを分解して単語群を生成する ■
LuceneはAnalyzerがある ■ CharFilter/Tokenizer/TokenFilterで構成される ■ 組み合わせることで自由自在の解析可能 ■ インデックスの生成時に設定する 単語に分割する 16 「今日の天気は晴れです」 ↓ 「今日」「天気」「晴れ」
17.
DBFluteフェス 2017 Analyzer 17 「東京スカイツリーの①番出口」 CharFilter (文字単位で変換) TokenFilter
(単語単位で変換) Tokenizer (単語に分割) 「東京スカイツリーの1番出口」 「東京」「スカイツリー」「の」「1番」「出口」 「東京」「スカイツリ」「1番」「出口」 Analyzer CharFilter (文字単位で変換)CharFilter (文字単位で変換) TokenFilter (単語単位で変換)TokenFilter (単語単位で変換)
18.
DBFluteフェス 2017 検索の全体像 18 インデックス検索 Analyzer Analyzer 検索対象 検索時 クロール/インデクシング時 ■
検索とインデックス時にAnalyzerを利用 ■ それぞれで別なAnalyzerも指定可能 ■ 同じ単語にならなければヒットしない
19.
DBFluteフェス 2017 よく使うクエリーを 見ていきましょう 19
20.
DBFluteフェス 2017 ■ 構造的なQuery
DSLを利用 ■ HTTPまたはTransportでリクエスト ■ 様々なクエリーをサポート(aggs, geo,...) 検索クエリー 20 $ curl -XPOST ‘localhost:9200/company/_search -d ‘{ “query” : { "match_phrase" : { "content" : "fess" } }, “size”: 10 }
21.
DBFluteフェス 2017 ■ 全件にマッチするクエリー ➔
count等で利用 Match All Query 21 { "query": { "match_all": {} } }
22.
DBFluteフェス 2017 ■ 解析された文字列にマッチするクエリー ➔
全文検索で利用 ➔ Match〜QueryはAnalyzerが適用される ■ 解析された文字列にマッチするので、lowercaseさ れるならfluteはFluteにも一致する ➔ フレーズとしてはマッチしない ➔ 日本語bi-gramでは期待通りの結果にならない Match Query { "query": { "match": { "product_name": "flute" } } } 22
23.
DBFluteフェス 2017 ■ 解析された文字列のフレーズでマッチする ➔
タームの順番も含めて一致する ➔ 日本語の場合、ほぼこのクエリーを利用する ➔ Match Queryの場合、並び順に関係なく、ヒットする ➔ Match Queryでもphase指定で検索可能 Match Phrase Query { "query": { "match_phrase": { "product_name": "Low Price Flute" } } } 23
24.
DBFluteフェス 2017 ■ 指定された値にマッチするクエリー ➔
テキスト解析はされず、値そのものにマッチする ➔ 区分値など、値のまま、インデックスしたものの検索 ➔ keyword型のフィールドに対して利用 ➔ Analyzerが適用されない Term Query { "query": { "term": { "product_handle_code": { "value": "FLUTE-01" } } } } 24
25.
DBFluteフェス 2017 ■ 前方一致のクエリー ➔
Term Queryの前方一致検索版 ➔ テキスト解析されないフィールドで利用する Prefix Query { "query": { "prefix": { "product_category": { "value": "Ins" } } } } 25
26.
DBFluteフェス 2017 ■ 範囲指定検索 ➔
数値や日付を範囲指定する場合に利用する ➔ gt, gte, lt, lteで範囲を指定 Range Query { "query": { "range": { "latest_purchase_date": { "gte": "2017-11-01", "lte": "2017-11-30" } } } } 26
27.
DBFluteフェス 2017 ■ and/or/not条件を合成するクエリー ➔
and条件: mustで指定する(複数指定可能) ➔ or条件: shouldで指定する(複数指定可能) ➔ not条件: mustNotで指定する(複数指定可能) ➔ 絞り込み条件: filterで指定する(複数指定可能) Bool Query { "query": { "bool": { "must": [...], "should": [...], "must_not": [...], "filter": [...] } } } 27
28.
DBFluteフェス 2017 ■ スコアを調整するクエリー ➔
functionsにマッチしたものをもとにスコアを変える ➔ queryには通常の検索条件を指定する Function Score Query { "query": { "function_score": { "query": { ...ここに通常の条件を書く ... }, "functions": [ { "filter": { "match": {"test": "cat"} ←スコアを調整したい条件 }, "weight": 42 } ] } } } 28
29.
DBFluteフェス 2017 ■ 検索時に集計処理も同時に行う ➔
統計情報とかヒストグラムとか ➔ ファセットとかドリルダウンとか Aggregation 29 { "query": { ...検索条件... }, "aggs": { "category": { "terms": { "field": "product_category", "size": 10 } } } }
30.
DBFluteフェス 2017 ■ フィールド値が範囲内にある件数を取得する ➔
Rangeが返却される Range Aggregation { "query": { ...検索条件...}, "aggs": { "price": { "range": { "field": "price", "ranges": [ { "from": 1000, "to": 5000 }, …集計したい範囲の条件を記述... ] } } } } 30
31.
DBFluteフェス 2017 ■ 指定した単語が含まれる件数を取得する ➔
Termsが返却される ➔ 含まれる単語と件数が取得できる Terms Aggregation { "query": { ...検索条件... }, "aggs": { "category": { "terms": { "field": "product_category", "size": 10 } } } } 31
32.
DBFluteフェス 2017 ■ 指定したフィルタで項目を絞り込む ➔
子のAggregationをフィルタするときに利用 ■ ➔ ➔ Filter Aggregation { "query": { ...検索条件... }, "aggs": { "handle_code": { "filter": { "term": { "product_handle_code": "FLUTE-01" } }, "aggs": { ←フィルタされたあとの結果に対してのアグリゲーションを記述 "category": { "terms": { "field": "product_category" } } } } } } 32
33.
DBFluteフェス 2017 ■ 文字列:
keyword, text ■ 数値: long, integer, short, byte, double, float, half_float, scaled_float ■ 日付: date ■ 論理値: boolean ■ バイナリ: binary ■ 範囲: integer_range, float_range, double_range, date_range ■ その他: object, geo_point, geo_shape, ip, completion, token_count, …(独自定義も可能) 基本的な型 33
34.
DBFluteフェス 2017 ここからは さまざま疑問を 見ていきましょう 34
35.
DBFluteフェス 2017 部分一致検索をしたいのですが? 35
36.
DBFluteフェス 2017 ■ 全文検索なので基本は部分一致 ➔LIKE的な要件… ■
逆に、完全一致の要件が必要なら、Term Queryが 必要 部分一致検索? 36
37.
DBFluteフェス 2017 「魚」で検索しても ヒットしないみたいです 37
38.
DBFluteフェス 2017 ■ bi-gramのインデックスではヒットしない ➔2文字単位で単語になっているため ➔「魚料理」→「魚料」「料理」 ■
uni-gramのインデックスにする? ➔インデックスサイズが大きくなる… ■ 形態素解析のインデックスにする? ➔一文字に分割されないものもある ➔「魚料理」→「魚」「料理」(この場合「理」とか☓) ■ bi-gramのままでPrefix Queryにする ➔魚?で「魚料」にヒットさせる ➔インデックスする文字列にも最後に1文字加える 一文字検索 38
39.
DBFluteフェス 2017 クリック数やLike数が 多いものを上位に表示したいですね 39
40.
DBFluteフェス 2017 ■ クリック数やLike数をドキュメントに保持する ■
クリック数は検索結果クリック時に集計 ➔リンクを書き換えてリダイレクト ■ Function Score Queryでスコアに反映する 検索ログの取得 40 利用者 Fess 検索結果を表示 検索結果をクリック 検索結果へリダイレクト 検索結果のサイト ここでクリック情報を取得
41.
DBFluteフェス 2017 日本語はもちろん 英語、フランス語、ドイツ語、中国語… で検索したいです 41
42.
DBFluteフェス 2017 ■ 全各言語用に様々なAnalyzerが必要 ➔日本語だとKuromojiとか ■
言語固有とbi-gramの2つのインデックス作成 ➔日本語なら形態素解析とbi-gramの2種類 ➔or検索(boolのshould等)をする ■ Fessでは多言語の設定を利用 ➔いろいろと書いてあるので必要なところ参考に https://github.com/codelibs/fess/blob/11.4.x/src/main/resources/fess_indices/fess.json ■ さらにFessでは言語自動判定も利用 多言語での検索 42
43.
DBFluteフェス 2017 辞書はいつ反映されるの? 43
44.
DBFluteフェス 2017 ■ Analyzer等の辞書はインデックスのオープン時に 読み込まれる ➔クローズして再オープンする ➔Fessは拡張してリアルタイム再読込させる機能がある ■
インデックス時の書き込んだ単語は再インデックス しないと、単語が一致しない場合は検索できない 辞書の反映 44
45.
DBFluteフェス 2017 特定の検索語のときに 関連する検索語も 一緒に検索したいですね 45
46.
DBFluteフェス 2017 ■ Google
Search Applianceが保有する機能なので 普通に要求される場合が多い ■ Analyzerで同義語辞書で対応可能な場合もある ➔リアルタイムな反映が求められると☓ ■ 関連クエリーと同等なものを作るしかない ➔Fessでは実装済み ➔関連コンテンツ的な機能もあったり… 関連クエリー 46
47.
DBFluteフェス 2017 類似する結果はまとめたいな 47
48.
DBFluteフェス 2017 ■ ElasticsearchのField
Collapsingを利用 ➔指定したフィールドが同じものをまとめる ■ Fessではcontentをminhashでハッシュ化 ➔類似したものは同じハッシュになる 類似結果をまとめる 48
49.
DBFluteフェス 2017 検索結果にサムネイルも 一緒に表示したいのだけど 49
50.
DBFluteフェス 2017 ■ クロールとは別に画像生成処理を実行 ■
HTMLであればページ内で指定された画像 ➔metaタグのthumbnailかog:imageなど ➔ページ内のimgタグで正方形に近い画像など ➔PhantomJSなどでがんばる必要はない ■ PDFであればImageMagickのconvertコマンド ■ MS Officeはunoconvとconvertの合せ技 サムネイル画像 50
51.
DBFluteフェス 2017 共有フォルダのファイルを 検索したい 51
52.
DBFluteフェス 2017 ■ http://〜の検索結果ページでfile://〜のリンクが機 能しない ➔セキュリティポリシーの設定で有効な場合もある? ■
対応方法としては… ➔WebDAVでhttp://〜等でアクセス可能にする ➔Fessではプロキシとして対象ファイルを返却 file://〜問題 52
53.
DBFluteフェス 2017 h1〜h3タグに書いてあるものは 上位に出したいね 53
54.
DBFluteフェス 2017 ■ GSAが特定のタグの値を優先する機能を持つ ■
優先するフィールドを作成して、検索時にそのスコ アをブーストする ➔Fessではtitleと同様のブーストするように設定 特定の情報を優先する 54
55.
DBFluteフェス 2017 ここからは クロール関連の話 55
56.
DBFluteフェス 2017 ■ 検索対象になるものはいろいろある ➔インターネット:http(s) ➔ファイルシステム:FS,
SMB, FTP ➔データベース:JDBC ➔APIでアクセスできるもの:無数にある… ■ これらをクロール時には様々な罠も存在… クロール対象 56
57.
DBFluteフェス 2017 DBをクロール対象にしたい 57
58.
DBFluteフェス 2017 ■ Fessなら管理画面から設定可能 ➔JDBCドライバがあるDBなら対応 ➔select文とそのrowのマッピングを記述するだけ ➔elasticsearchのmappingも対応 DBも検索対象にしたい 58
59.
DBFluteフェス 2017 数十〜数百サイトをクロールしたいな 59
60.
DBFluteフェス 2017 ■ 管理対象が多いと複雑なジョブ管理が必要 ■
クロールの開始やスケジューリング等が必要 ➔クラスタ構成等を考え出すとより開発工数が… ➔Fessではジョブ管理機能(lasta-jobベース)を実装 クロール処理の制御 60
61.
DBFluteフェス 2017 どのくらいクロールに 時間がかかりますか? 61
62.
DBFluteフェス 2017 ■ スペックやクロール対象に依存する! ■
Webやファイルシステムだと1台で1時間あたり?万 ドキュメントくらい ■ DBからだともっといける(はず) クロールにかかる時間 62
63.
DBFluteフェス 2017 検索対象のサイトをhttps化したら 検索にヒットしなくなったんですけど 63
64.
DBFluteフェス 2017 ■ サイトのhttps化でクロール設定を変更忘れ ➔httpだけをクロール対象にしていた ➔サイトのhttps化で検索対象が全部消える… ➔人為的なミス ■
最近https化が進んできているので、しばらくこの事 象が増えるかも… https化による人災 64
65.
DBFluteフェス 2017 特定のファイルでクロールが止まります 65
66.
DBFluteフェス 2017 ■ zipファイル爆弾 ➔展開すると数Gのファイルになる ➔展開時には展開後のサイズの考慮が必要 ■
excelファイル爆弾 ➔何でもExcelにコピペする人がいる… ➔無駄な単語が膨大にあり、Analyzerで高負荷に… ■ Fessではこれの爆弾処理 ➔ファイルサイズのチェック ➔単語の切り捨て ➔重複除去 などなど… 〜爆弾ファイル 66
67.
DBFluteフェス 2017 PDFが文字化けしているようです 67
68.
DBFluteフェス 2017 ■ PDFのフォーマットにも複数のバージョン ■
テキスト抽出ならJavaだとPDFBoxとか ■ PDFBoxは古いバージョンで文字化けする ➔古いバージョンなので気にする必要はない ➔最近のPDFBoxは安定してきた ■ (おまけ)その他ではOCRのPDFとかの場合 ➔無駄なスペースが入るので、独別な処理が必要 PDF文字化け 68
69.
DBFluteフェス 2017 対応しているSMBバージョンは なんですか? 69
70.
DBFluteフェス 2017 ■ SMBには1〜3.xのバージョンがある ■
jcifsはSMB1 ➔SMB1を無効にした環境では使えない ➔Windows 2012あたりからSMB1を無効にできる ■ これから作るならSMBJとか? ➔Fessは近いうちに移行予定 SMBのバージョン 70
71.
DBFluteフェス 2017 その他 71
72.
DBFluteフェス 2017 _idの長さ問題 72
73.
DBFluteフェス 2017 ■ IDなのでユニークなら何でも良い ■
Elastisearchの_idは512バイトの長さまで ➔FessはURLベースで長い場合は部分的にハッシュ化 _idをどうするか 73
74.
DBFluteフェス 2017 どのくらいのスペックが必要ですか? 74
75.
DBFluteフェス 2017 ■ 検索対象にもよるので一概に言えない ■
1シャードの性能を見てみるとか ■ Elastisearchのドキュメントを見るとか サイジング 75
76.
DBFluteフェス 2017 まとめ 76
77.
DBFluteフェス 2017 ■ 検索システムを作るのもけっこう大変です ■
Lucene/Elasticsearchを直接使わなくても良い場合が ほとんどでは? ➔ Fessを使ってください!(たぶんFessに任せたほうが楽) ➔ DB連携もJDBCでSQLを書くだけです ➔ 検索結果はJSONで取得できます ■ 検索自体を作りたい場合はLuceneやElasticsearchを 直接使うのが良いと思います まとめ 77
Jetzt herunterladen