2

Django、Haystack、ElasticSearchを使用しています。順序付けられたフィールド値が空( "")の結果が、空でない結果の後に来るように、検索結果を順序付けたいと思います。これを実行できるAPIがHaystackに見つかりません。ElasticSearchに送信されるリクエストは次のようになります。

{
   "sort":[
      {
         "version":{
            "order":"asc"
         }
      }
   ],
   "query":{
      ...
   }
}

このElasticSearchクエリを書き直して、「version」の文字列が空の結果が「version」が存在する結果の後に来るようにする方法はありますか?

私はこれをPythonで次のように実装しました:

sorted(sqs, key=lambda x: getattr(x, 'version') == '')
4

1 に答える 1

2

このクエリは、空でないバージョンのすべてのレコードに1.0の_scoreを割り当て、空のバージョンのすべてのレコードに2.0の_scoreを割り当てます。次に、_scoreで昇順で並べ替え、次にバージョンで昇順で並べ替えます。その結果、バージョンが空のすべてのレコードがリストの一番下にプッシュされます。

{
    "query": {
        "custom_filters_score" : {
            "query" : {
                "constant_score": {
                    "query": {
                        .... your original query ....                        
                    }
                }
            },
            "filters" : [
                {
                    "filter" : { "missing" : { "field" :  "version"} },
                    "boost" : "2"
                }
            ]
        }        
    },
    "sort": [
        {
            "_score": {"order":"asc"}
        },
        {
            "version": {"order":"asc"}
        }
    ]
}
于 2012-12-18T00:18:08.943 に答える