0

ElasticSearch 版本:0.90.1,JVM:1.6.0_51(20.51-b01-457)

我试图用我的 ElasticSearch 查询做两件事:1)根据布尔值(可搜索)和“open_date <明天”过滤结果,2)按字段“open_date”DESC 进行两个排序

这会产生以下查询:

{
  "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

我不确定轮胎代码,但 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 回答