Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

mimiのElasticsearch活用例/mimi-es

yazaki_r
September 19, 2017

 mimiのElasticsearch活用例/mimi-es

yazaki_r

September 19, 2017
Tweet

Other Decks in Programming

Transcript

  1. 機能紹介:タイプ検索(2) 【設定可能条件】 ・年齢 ・居住地 ・加工画像排除 ・目/鼻/口/眉など ・髪型/髪色/体型/肌の色など ・メガネ/八重歯/鎖骨など カスタムタイプで検索条件を細かくできる! 【設定例】

    ・年齢:18 - 22歳 ・居住地:東京 AND 神奈川 ・加工画像排除ON ・目:奥二重 ・髪型:ロング ・髪色:黒髪 ・その他:八重歯 他にもマニアックな設定が色々できるよ!
  2. 特徴:豊富な検索機能 カスタム検索 【設定可能条件】 ・年齢 ・居住地 ・加工画像排除 ・目/鼻/口/眉など ・髪型/髪色/体型/肌の色など ・メガネ/八重歯/鎖骨など }

    } 完全一致 スコアマッチ ※一致している人だけ出したい ※一致している順で出したい 基本条件 見た目条件
  3. 検索事例 ・基本的にスコア付けはboolクエリを応用{ "mimi_matching": { "mappings": { "appearance_female": { "properties": {

    "academic_career": { "type": "long" }, Must クエリ{ And条件。 filterと違いスコアが計算される。 Should クエリ Or条件。 filterと違いスコアが計算される。 Filter クエリ And条件。 スコアが計算されない。
  4. 検索事例 【要件】 ・男女で検索項目が異なるのでそれぞれ検索したい curl -XGET 'http://******/mimi_index/_mapping?pretty' { "mimi_index": { "mappings":

    { "appearance_female": { "properties": { "academic_career": { "type": "long" }, …… curl -XGET 'http://******/mimi_index/_mapping?pretty' { "mimi_index": { "mappings": { "appearance_male": { "properties": { "academic_career": { "type": "long" }, …… →男女でtypeを分ける 男性用 女性用
  5. 検索事例 【要件】 ・一部項目は完全一致で検索したい(居住地など)/ 年齢などは範囲検索したい(1) "mimi_index": { "mappings": { "appearance_male": {

    "properties": { "living_place": { "type": "long" }, "age": { "type": "long" }, //// 以下略 →居住地は居住地ID(long)を、年齢も数値(long)を保存。 マッピング 居住地(living_place):東京(ID:1) 年齢(age):20歳 “fields”:{ "living_place": 1, "age": 20, } ※居住地IDは仮 保存内容例 保存内容例
  6. 検索事例 【要件】 ・一部項目は完全一致で検索したい(居住地など)/ 年齢などは範囲検索したい(2) →bool クエリでmust/range検索 "query": { "bool":{"must":[ {"range":

    {"age":{"gte":18,"lte":22}} }, {"terms": {"living_place":[1,2]} }]} } クエリ例 居住地(living_place):東京or神奈川 年齢(age):18歳以上22歳以下 クエリ例 WHERE (`age` >= 18 AND `age` <= 22 ) AND `living_place` IN (1,2); MySQLだとこんな感じ
  7. 検索事例 【要件】 ・さらに見た目条件は一致率が高いものから順に表示したい(2) "mimi_index": { "mappings": { "appearance_male": { "properties":

    { "eye": { "type": "long" }, "hair_color": { "type": "long" }, //// 以下略 →見た目マスタID(long)を保存。 マッピング 目(eye):ぱっちり二重(ID:1) 髪の色(hair_color):黒髪(ID:1) “fields”:{ "eye": 1, "hair_color": 1, } ※見た目の各IDは仮 保存内容例 保存内容例
  8. 検索事例 【要件】 ・さらに見た目条件は一致率が高いものから順に表示したい(2) →bool クエリでshouldでterms検索、_scoreでソート "query": { "bool":{"should":[ {"terms": {"eye":[1,2]}},

    {"terms": {"hair_color":[1,2]}} ] }, "sort":[ {"_score":"desc"} ] クエリ 目(eye):ぱっちり二重 , 奥二重 髪の色(hair_color):黒髪 , 茶髪 クエリ例 実現できない! MySqlだと、、、
  9. インデックス再構築事例 - 問題点 【設定可能条件】 ・年収/職業/血液型など ・趣味・よく行く場所など ・タバコ/お酒の頻度など ・結婚の意思/デート費用など ElasticSearch には格納されていない

    フィールド多数ある 【設定可能条件】 ・登録日/最終ログイン日 たまたま登録されていたが、 フィールドのtype が 想定と違う "created": { "type": "string" }, インデックス再定義が必要
  10. インデックス再構築事例 - インデックス再定義実行 ・別インデックスを作成 / 足りないフィールドを追加したマッピングを作成{ "mimi_matching": { "mappings": {

    "appearance_female": { "properties": { "academic_career": { "type": "long" }, "mimi_index_v2": { "mappings": { "appearance_male": { "properties": { "blood_type": { "type": "long" }, "create_time": { "type": "date", "format": "yyyy-mm-dd HH:mm:ss" }, "last_login_time": { "type": "date", "format": "yyyy-mm-dd HH:mm:ss" }, マッピング 登録時間(create_time):2017-08-30 11:00:00 ログイン時間(last_login_time):2017-08-30 11:00:00 保存内容例
  11. Application エイリアス ・re_index API でドキュメントをコピー mimi_index mimi_index mimi_index_new インデックス re_index

    旧インデックス 新インデックス インデックス再構築事例 -(案1)エイリアスを作成して切り替える
  12. Application エイリアス ・ mimi_index mimi_index mimi_index_new インデックス 旧インデックス 新インデックス ・

    エイリアスの付け先を変更する インデックス再構築事例 -(案1)エイリアスを作成して切り替える
  13. インデックス再構築事例 - (案2)アプリケーション側で調整する Application ・ mimi_index mimi_index_new インデックス 旧インデックス 新インデックス

    INSERT/SELECT INSERT only ・更新/参照は旧インデックス、新インデックスにも更新を行うようにする
  14. Application mimi_index mimi_index_new インデックス 旧インデックス 新インデックス INSERT/SELECT INSERT only ・アプリケーションで接続先切り替え

    更新/参照は新インデックス、旧インデックスにも更新を行うようにする インデックス再構築事例 - (案2)アプリケーション側で調整する
  15. 今後やりたいこと(1) ・特定条件によってFunctionScore クエリで重み付けしたい "mappings": { "appearance_female": { "properties": { "academic_career":

    { "type": "long" }, "query": { "function_score": { "query": { "bool": { "should": [{ "term": {"eye":[1,2],}}]} }, "score_mode": "sum", "boost_mode": "multiply", "functions": [{{ "filter": { "term": { {"age":{"gte":25,"lte":29}}}}, "weight": 10 }, {"filter": { "term": { {"age":{"gte":20,"lte":24}} }}, "weight": 5 }, クエリ ユーザーによって年齢の近い順など 様々な条件で重み付け これにより様々な条件で ユーザーを並べ替えられる! マッチングサービスな のでコレ大事