2

ElasticSearch に次のようなドキュメントを保存するとします。

{
    'name':'user name', 
    'age':43, 
    'location':'CA, USA', 
    'bio':'into java, scala, python ..etc.', 
    'tags':['java','scala','python','django','lift']
}

また、location=CA を使用して検索したとします。「タグ」内のアイテムの数に従って結果を並べ替えるにはどうすればよいですか?

最初のページにタグの数が最も多い人をリストしたいと思います。

4

1 に答える 1

3

タグの数を含む追加のフィールドにインデックスを付けて、結果を簡単に並べ替えることができます。それ以外の場合は、クエリ時にパフォーマンス コストを多少犠牲にしても構わない場合は、データの再インデックスを必要としない優れたソリューションがあります。次のようなスクリプトに基づいて並べ替えることができます。

{
    "query" : {
        "match_all" : {}
    },
    "sort" : {
        "_script" : { 
            "script" : "doc['tags'].values.length",
            "type" : "number",
            "order" : "asc"
        }
    }
}

スクリプトベースの並べ替えセクションから読み取ることができるように:

単一のカスタム ベースのスクリプト ベースの並べ替えでは、代わりに custom_score クエリを使用することをお勧めします。これは、スコアに基づく並べ替えの方が高速であるためです。

つまり、カスタム スコア クエリを使用してスコアに影響を与えてから、次のようにスコアで並べ替えた方がよいということです。

{
    "query" : {
        "custom_score" : {
            "query" : {
                "match_all" : {}
            },
            "script" : "_score * doc['tags'].values.length"
        }
    }
}
于 2012-10-04T19:37:24.853 に答える