0

エラスティックサーチ バージョン: 0.90.1、JVM: 1.6.0_51(20.51-b01-457)

私はElasticSearchクエリで2つのことをしようとしています.1)ブール値(検索可能)と「open_date <明日」に基づいて結果をフィルタリングし、2)フィールド「open_date」DESCで2つ並べ替えます

これにより、次のクエリが生成されます。

{
  "query": {
    "bool": {
      "should": [
        {
          "prefix": {
            "name": "foobar"
          }
        },
        {
          "query_string": {
            "query": "foobar"
          }
        },
        {
          "match": {
            "name": {
              "query": "foobar"
            }
          }
        }
      ],
      "minimum_number_should_match": 1
    },
    "filtered": {
      "filter": {
        "and": [
          {
            "term": {
              "searchable": true
            }
          },
          {
            "range": {
              "open_date": {
                "lt": "2013-07-16"
              }
            }
          }
        ]
      }
    }
  },
  "sort": [
    {
      "open_date": "desc"
    }
  ]
}

ただし、返される結果は「open_date」でソートされていません。フィルターを削除すると:

{
  "query": {
    "bool": {
      "should": [
        {
          "prefix": {
            "name": "foobar"
          }
        },
        {
          "query_string": {
            "query": "foobar"
          }
        },
        {
          "match": {
            "name": {
              "query": "foobar"
            }
          }
        }
      ],
      "minimum_number_should_match": 1
    }
  },
  "sort": [
    {
      "open_date": "desc"
    }
  ]
}

...結果は期待どおりに返されます。

何か案は?

4

1 に答える 1

3

Tire コードについてはよくわかりませんが、JSON はフィルター処理されたクエリを正しく構築しません。私の推測では、これによりオーバーフローが発生し、ソート要素も正しく解析されなくなります。

フィルタリングされたクエリは、次のように作成する必要があります ( http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/を参照)。

{
   "query": {
      "filtered": { // Note: this contains both query and filter
         "query": {
            "bool": {
               "should": [
                  {
                     "prefix": {
                        "name": "foobar"
                     }
                  },
                  {
                     "query_string": {
                        "query": "foobar"
                     }
                  },
                  {
                     "match": {
                        "name": {
                           "query": "foobar"
                        }
                     }
                  }
               ],
               "minimum_number_should_match": 1
            }
         },
         "filter": {
            "and": [
               {
                  "term": {
                     "searchable": true
                  }
               },
               {
                  "range": {
                     "open_date": {
                        "lt": "2013-07-16"
                     }
                  }
               }
            ]
         }
      }
   },
   "sort": [
      {
         "open_date": "desc"
      }
   ]
}

乾杯、ボアズ

于 2013-07-15T20:02:44.743 に答える