2017-09-11 9 views
0

スコア私は現在、このようになりますESでネストされたオブジェクトinterest_scores持っている:私はを実行する検索語を入力するとElasticsearch - 関数内でネストされたオブジェクトの値を使用して

[{ 
    username: 'Somebody', 
    interest_scores: [ 
     { name: 'Running', score: 10 } 
     { name: 'Food and drinks', score: 21 } 
    ] 
}, 
{ 
    username: 'SomebodyElse', 
    interest_scores: [ 
     { name: 'Running', score: 7 } 
     { name: 'Food and drinks', score: 29 } 
    ] 
}] 

を私は最高で、ユーザをしたいと思いますscoreを実行すると、最初に返されます。

これを行う方法は、Function Score Queryを使用することですが、関数/スクリプトで一致する検索語を使用する方法がわかりません。私が思うには、クエリが "実行中"の関心を持っているすべてのドキュメントを返してから、interest_scores.{match}.scoreのようなものを使用してドキュメントのスコアに追加したり、ドキュメントのスコアを掛けたりすることができます。

これについてのお手伝いをさせていただきますようお願い申し上げます。要求されたよう

、ここにマッピングです:

{ 
 
    "influencers": { 
 
    "mappings": { 
 
     "influencer": { 
 
     "properties": { 
 
      "email": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "gender": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "geo": { 
 
      "type": "geo_point" 
 
      }, 
 
      "hashtags": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "id": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "interest_scores": { 
 
      "type": "nested", 
 
      "properties": { 
 
       "name": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "score": { 
 
       "type": "long" 
 
       } 
 
      } 
 
      }, 
 
      "interests": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "language": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "location": { 
 
      "properties": { 
 
       "city": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "country": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "country_code": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "lat": { 
 
       "type": "float" 
 
       }, 
 
       "lng": { 
 
       "type": "float" 
 
       }, 
 
       "state_code": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       }, 
 
       "subdivision": { 
 
       "type": "text", 
 
       "fields": { 
 
        "keyword": { 
 
        "type": "keyword", 
 
        "ignore_above": 256 
 
        } 
 
       } 
 
       } 
 
      } 
 
      }, 
 
      "network_data": { 
 
      "properties": { 
 
       "facebook": { 
 
       "properties": { 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "instagram": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "pinterest": { 
 
       "properties": { 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "twitter": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        } 
 
       } 
 
       }, 
 
       "youtube": { 
 
       "properties": { 
 
        "bio": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "engagement": { 
 
        "type": "float" 
 
        }, 
 
        "id": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "picture": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "reach": { 
 
        "type": "long" 
 
        }, 
 
        "url": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "username": { 
 
        "type": "text", 
 
        "fields": { 
 
         "keyword": { 
 
         "type": "keyword", 
 
         "ignore_above": 256 
 
         } 
 
        } 
 
        }, 
 
        "videos": { 
 
        "type": "long" 
 
        }, 
 
        "views": { 
 
        "type": "long" 
 
        }, 
 
        "views_per_video": { 
 
        "type": "float" 
 
        } 
 
       } 
 
       } 
 
      } 
 
      }, 
 
      "networks": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "picture": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      }, 
 
      "total_reach": { 
 
      "type": "long" 
 
      }, 
 
      "username": { 
 
      "type": "text", 
 
      "fields": { 
 
       "keyword": { 
 
       "type": "keyword", 
 
       "ignore_above": 256 
 
       } 
 
      } 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

私は私だけKibanaの開発ツールでテストしてい、まだ機能スコアのクエリを持っていない - 私はすべてを持っています他のフィルタは正しく動作します。私はちょうどそのinterest_scores.name

interest_scores.scoreでヒットを並べ替え、検索用語がinterest_scores.nameに一致した場合、」言うことを探しています更新

以下は、私がKibana devのツールでそれをテストしたときに動作しているようです。私はいくつかの異なる海でそれをテストしている

{ 
 
    "query": { 
 
    "nested": { 
 
     "path": "interest_scores", 
 
     "score_mode": "sum", 
 
     "query": { 
 
     "function_score": { 
 
      "query": { 
 
       "match": { "interest_scores.name": "Running" } 
 
      }, 
 
      "script_score": { 
 
      "script": "_score + doc['interest_scores.score'].value" 
 
      } 
 
     } 
 
     } 
 
    } 
 
    } 
 
}

最初に最高スコアを返しますが、奇妙なのはscript_score機能を削除しても同じ結果が得られるということです。誰もがこれが良い解決策であるか、またはそれがscript_scoreなしで動作する理由を教えてもらえますか?

+0

マッピングと使用したクエリを追加できますか? – Eli

答えて

0

としてあなたがネストされたフィールドで並べ替えることができ、hereを説明:あなたが唯一の関連するネストされた文書を表示するinner_hits能力を使用することができ、

{ 
    "_source": false, # for inner hits - you can remove it 
    "query": { 
    "nested": { 
     "path": "interest_scores", 
     "filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     }, 
     "inner_hits": {} # for inner hits - you can remove it 
    } 
    }, 
    "sort": { 
    "interest_scores.score": { 
     "order": "desc", 
     "mode": "max", 
     "nested_filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     } 
    } 
    } 
} 

*ご注意ください。すべてのインナーヒット文書が関連している場合 - マークされた行を削除してください。 フィールドまたは他のフィールド(たとえば、フィルタリングするname)でフィルタを使用してください。

EDIT 1:あなたが特定の名前のソートされたスコアを取得したい場合は 、試してみてください。

{ 
    "_source": false, 
    "query": { 
    "nested": { 
     "path": "interest_scores", 
     "filter": { 
     "term": { 
      "interest_scores.name": "SCORE_NAME" 
     } 
     }, 
     "inner_hits": {} 
    } 
    }, 
    "sort": { 
    "interest_scores.score": { 
     "order": "desc", 
     "mode": "max", 
     "nested_filter": { 
     "range": { 
      "interest_scores.score": { 
      "gte": "0" 
      } 
     } 
     } 
    } 
    } 
} 

ではなくSCORE_NAMEを希望得点名を入れてください。

+0

情報をお寄せいただきありがとうございます。ネストされたフィールドをソートする際のドキュメントを読みましたが、Elasticsearchに 'interest_scores 'でソートするように指示するにはどうしたらいいですか?特定の 'interest_scores.name'のための「スコア」? 私はESに伝えたい "この単語/フレーズが' interest_scores.name'にある場合、 'interest_scores.score'でソートしてください。 – ryantbrown

+0

私は自分の答えを更新しました – Eli

関連する問題