Download - Elasticsearch 20150107
Lucene Query 再考- Domain Specific Query 実装 -
07/01/2015
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
2
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
3
自己紹介
• 大川 真吾GitHub @shingoOKAWATwitter @okawa_shingo
• Supership 株式会社 インフラ事業開発本部検索グループ エンジニア2015 年 11 月入社
• バックエンドエンジニア (Elasticsearch 歴 3 ヶ月目 池田さん感謝 )検索エンジン関連バックエンド設計 / 実装全般
• 静岡出身、加速器工学専攻 ( 物理シミュレーションとか )
• プログラミング好き 4
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
5
Supership 株式会社について
7
3 社合併 2 社グループ会社化
• 2015 年 11 月に 3 社合併
インターネットサービス事業広告事業プラットフォーム事業
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
8
Query Parser 実装してみた
• こんな Query Parser 実装してみた
⑴クエリテキストレベルで近接検索(Proximity Search) や 分離検索 (DisMax) 対応
⑵文法の違いをクエリテキストレベルで隠蔽
⑶簡素な BNF で DSQ(Domain Specific Query) を簡単に実装可能
⑷構文木 (Concrete/Abstract Syntax Tree) 周りの API 対応
9
検索プラットフォームの実現
Query Parser 実装してみた
• 何が嬉しいの?
⑴距離などを考慮したより詳細な検索実現
⑵検索プラットフォーム実現によりプロダクト・サービスの多様化、統合対応
⑶小さなコストで種々の検索 UX 改善サイクルを回せる
⑷トークンの揺らぎ ( 同義語など ) 等を、プログラマブルに構文木レベルで対応
10
Query Parser 実装してみた
1. 近接検索
PhraseQuery や SpanQuery ( 後述 )
Term 間の距離を検索条件として付加できる
11
PhraseQuery: “cat dog bird”, slop: 3 SpanQuery: “cat dog” bird, slop: 3
cat birdhorse lizard dog
2 0
cat birdhorse lizarddog
20
Query Parser 実装してみた
2. 文法の隠蔽 (Hetero Grammar)
12
Query Parser 実装してみた
3. 直感的で分かりやすい ANTLR BNF
既存実装 QueryParser.jj と比較して直感的で分かりやすい
13
Query Query(String field) :{ Query q, firstQuery=null; int conj, mods;}{ mods=Modifiers() q=Clause(field) { addClause(clauses, CONJ_NONE, mods, q); if (mods == MOD_NONE) firstQuery=q; } : :
grammar ExternalQuery;import CommonLexerRules;
query : (expression)+ ;
expression : CONJUNCTION_AND clause | CONJUNCTION_OR clause | clause ;:::
Query Parser 実装してみた
4. 構文木 API
Concrete Syntax Tree や Abstract Syntax Tree を用いて解析フェーズを多段階に
品詞による Term 結合や Synonym 等の揺らぎをよりフレキシブルに対応可能
14Concrete Syntax Tree
OR
FF ドラクエ
Abstract Syntax Tree
BooleanClause
AT SAME POSITION
FF Final Fantasy ファイファン
TAG: BOOLEAN
TAG: TERM TAG: TERM
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
15
Lucene おさらい
• Apache Lucene IR Library
Language Analysis (Filtering, Normalize, Tokenize⑴ …)
Indexing and Storage (Lock-Free Indexing, Near-Real-Time Indexing⑵ …)
Querying (50-over Query Implemantations, Parser, Scoring Model⑶ …)
16
Querying 機能を積極的に使って”検索”プラットフォームとして Elasticsearch の QueryDSL を最大限利用
Lucene おさらい
17
Document- field1- field2 Text Analysis Chains
IndexWriterDocumentWriter
Indexing Chain
QueryParser Query String
IndexReader
ScorerQuery
Indexing Chain Segment
Persistent Layer
SegmentReaderTermsEnum
PositionsEnum
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
18
Lucene クエリと近接検索
• Apache Lucene Query API
⑴ 基本的なクエリ (TermQuery, BooleanQuery…)
⑵ 曖昧検索系のクエリ (WildcardQuery, RegexpQuery…)
⑶ 近接検索系のクエリ (SpanQuery, PhraseQuery…)
19
Lucene クエリと近接検索
• Apache Lucene Query API
⑴ 基本的なクエリ (TermQuery, BooleanQuery…)
⑵ 曖昧検索系のクエリ (WildcardQuery, RegexpQuery…)
⑶ 近接検索系のクエリ (SpanQuery, PhraseQuery…)
20
• ユーザーの検索文字列から如何に意図を汲み取るかが重要
• ユーザーはトークナイズのロジックなど知る由も無い• 品詞情報や同義語辞書、 Term 間距離等サービス側で考慮
Lucene クエリと近接検索
1. PhraseQuery
Term 間の距離を検索条件として付加できる
Search Phase で Analyzer によるトークナイズが適用される
21
“cat dog bird”, slop: 3
cat birdhorse lizard dog
2 0
21
Matched Document
PhraseQuery
cat
TermQuery TermQuery TermQuery
dog bird
Lucene クエリと近接検索
2. SpanNearQuery
SpanTerm 間の距離、その順序を検索条件として付加できる
Search Phase で Analyzer によるトークナイズが適用されない
22
“cat dog” bird, slop: 3
22
Matched Document
SpanNearQuery
cat
SpanTermQuery
dog bird
SpanTermQuery
SpanTermQuery
cat birdhorse lizarddog
20
Lucene クエリと近接検索
3. SpanOrQuery
SpanQuery の結果をマージ
BooleanClause は Occurrence からランキングを生成することが主目的
23
“cat dog bird”, slop: 3 OR “cat dog” bird, slop: 3
23Matched Documents
SpanOrQuery
SpanNearQuery
SpanNearQuery
cat birdhorse lizarddog
20
cat birddog
0 0
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
24
Domain Specific Query
1. 外部 ( 実サービス向け ) クエリ
2. 内部 ( 開発者向け ) クエリ
3. 距離検索クエリ
25
{ "query": { "hetero_query": { "query": "this AND that", "handler_name": "external_mapper” } }}
{ "query": { "hetero_query": { "query": "this AND that", "handler_name": ”internal_mapper” } }}
Domain Specific Query
26
grammar ExternalQuery;import CommonLexerRules;
query : (expression)+ ;
expression : CONJUNCTION_AND clause | CONJUNCTION_OR clause | clause ;
clause : MODIFIER_REQUIRE field | MODIFIER_NEGATE field | field ;
field : {_input.LT(2).getType() == COLON}? SINGLE_LITERAL COLON term | term ;
term : SINGLE_LITERAL # BareTerm | PHRASE_LITERAL # QuotedTerm ;
Domain Specific Query
27
grammar InternalQuery;import CommonLexerRules;
query : (expression)+ ;
expression : CONJUNCTION_AND clause | CONJUNCTION_DIS clause | CONJUNCTION_OR clause | LPAREN query RPAREN | clause ;
clause : MODIFIER_REQUIRE field (HAT SINGLE_LITERAL)? | MODIFIER_NEGATE field (HAT SINGLE_LITERAL)? | field (HAT SINGLE_LITERAL)? ;
field : {_input.LT(2).getType() == COLON}? SINGLE_LITERAL COLON term | term ;
term : SINGLE_LITERAL # BareTerm | PHRASE_LITERAL # QuotedTerm ;
概要
• 自己紹介
• Supership 株式会社について
• QueryParser 実装してみた
• Lucene おさらい
• Lucene クエリ と 近接検索
• Domain Specific Query
• 今後の予定
28
今後の予定
1. クエリ文法の充実 (Google 等価等 )
2. Synonym Map の AST API を用いた実装
3. 品詞による Term 結合の AST API を用いた実装
4. Span 系クエリ文法の精査
5. ドキュメント作成
その他 Query Parser 以外にも順次コア機能を開発予定公開可能なものは弊社リポジトリで公開
29