elasticsearch 20150107

29
Lucene Query 再再 - Domain Specific Query 再再 - 07/01/2015

Upload: shingookawa

Post on 13-Apr-2017

572 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Elasticsearch 20150107

Lucene Query 再考- Domain Specific Query 実装 -

07/01/2015

Page 2: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

2

Page 3: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

3

Page 4: Elasticsearch 20150107

自己紹介

• 大川 真吾GitHub @shingoOKAWATwitter @okawa_shingo

• Supership 株式会社 インフラ事業開発本部検索グループ エンジニア2015 年 11 月入社

• バックエンドエンジニア (Elasticsearch 歴 3 ヶ月目 池田さん感謝 )検索エンジン関連バックエンド設計 / 実装全般

• 静岡出身、加速器工学専攻 ( 物理シミュレーションとか )

• プログラミング好き 4

Page 5: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

5

Page 6: Elasticsearch 20150107
Page 7: Elasticsearch 20150107

Supership 株式会社について

7

3 社合併 2 社グループ会社化

• 2015 年 11 月に 3 社合併 

インターネットサービス事業広告事業プラットフォーム事業

Page 8: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

8

Page 9: Elasticsearch 20150107

Query Parser 実装してみた

• こんな Query Parser 実装してみた

⑴クエリテキストレベルで近接検索(Proximity Search) や 分離検索 (DisMax) 対応

⑵文法の違いをクエリテキストレベルで隠蔽

⑶簡素な BNF で DSQ(Domain Specific Query) を簡単に実装可能

⑷構文木 (Concrete/Abstract Syntax Tree) 周りの API 対応

9

検索プラットフォームの実現

Page 10: Elasticsearch 20150107

Query Parser 実装してみた

• 何が嬉しいの?

⑴距離などを考慮したより詳細な検索実現

⑵検索プラットフォーム実現によりプロダクト・サービスの多様化、統合対応

⑶小さなコストで種々の検索 UX 改善サイクルを回せる

⑷トークンの揺らぎ ( 同義語など ) 等を、プログラマブルに構文木レベルで対応

10

Page 11: Elasticsearch 20150107

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

Page 12: Elasticsearch 20150107

Query Parser 実装してみた

2. 文法の隠蔽 (Hetero Grammar)

12

Page 13: Elasticsearch 20150107

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 ;:::

Page 14: Elasticsearch 20150107

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

Page 15: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

15

Page 16: Elasticsearch 20150107

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 を最大限利用

Page 17: Elasticsearch 20150107

Lucene おさらい

17

Document- field1- field2 Text Analysis Chains

IndexWriterDocumentWriter

Indexing Chain

QueryParser Query String

IndexReader

ScorerQuery

Indexing Chain Segment

Persistent Layer

SegmentReaderTermsEnum

PositionsEnum

Page 18: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

18

Page 19: Elasticsearch 20150107

Lucene クエリと近接検索

• Apache Lucene Query API

⑴ 基本的なクエリ (TermQuery, BooleanQuery…)

⑵ 曖昧検索系のクエリ (WildcardQuery, RegexpQuery…)

⑶ 近接検索系のクエリ (SpanQuery, PhraseQuery…)

19

Page 20: Elasticsearch 20150107

Lucene クエリと近接検索

• Apache Lucene Query API

⑴ 基本的なクエリ (TermQuery, BooleanQuery…)

⑵ 曖昧検索系のクエリ (WildcardQuery, RegexpQuery…)

⑶ 近接検索系のクエリ (SpanQuery, PhraseQuery…)

20

• ユーザーの検索文字列から如何に意図を汲み取るかが重要

• ユーザーはトークナイズのロジックなど知る由も無い• 品詞情報や同義語辞書、 Term 間距離等サービス側で考慮

Page 21: Elasticsearch 20150107

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

Page 22: Elasticsearch 20150107

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

Page 23: Elasticsearch 20150107

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

Page 24: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

24

Page 25: Elasticsearch 20150107

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” } }}

Page 26: Elasticsearch 20150107

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 ;

Page 27: Elasticsearch 20150107

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 ;

Page 28: Elasticsearch 20150107

概要

• 自己紹介

• Supership 株式会社について

• QueryParser 実装してみた

• Lucene おさらい

• Lucene クエリ と 近接検索

• Domain Specific Query

• 今後の予定

28

Page 29: Elasticsearch 20150107

今後の予定

1. クエリ文法の充実 (Google 等価等 )

2. Synonym Map の AST API を用いた実装

3. 品詞による Term 結合の AST API を用いた実装

4. Span 系クエリ文法の精査

5. ドキュメント作成

その他 Query Parser 以外にも順次コア機能を開発予定公開可能なものは弊社リポジトリで公開

29