"plain" 项查询与使用过滤器的项查询之间的区别

Difference between a "plain" terms query and a terms query using a filter

我正在尝试了解两者之间的区别:

这里是 terms 查询:

GET _search
{
   "query": {
      "terms": {
         "childcareTypes": [
            "SOLE_CHARGE",
            "OUT_OF_SCHOOL",
            "BABY_SITTING"
         ],
         "minimum_match": 3
      }
   }
}

这是过滤后的版本:

GET _search
{
   "query": {
      "filtered": {
         "filter": {
            "terms": {
               "childcareTypes": [
                  "SOLE_CHARGE",
                  "OUT_OF_SCHOOL",
                  "BABY_SITTING"
               ],
               "execution": "and"
            }
         }
      }
   }
}

两者 return 总点击数为 8000(针对我的索引)。

这是 "plain" 项查询的结果:

{
   "took": 7,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 8000,
      "max_score": 5.134171,
      "hits": [
         {
            "_index": "bignibou",
            "_type": "advertisement",
            "_id": "AUs2T2lt3L5LNr7nkot2",
            "_score": 5.134171,
            "_source": {
               "childcareWorkerType": "AUXILIAIRE_PARENTALE",
               "childcareTypes": [
                  "SOLE_CHARGE",
                  "OUT_OF_SCHOOL",
                  "BABY_SITTING"
               ],
               "address": {
                  "latitude": 48.8532558,
                  "longitude": 2.36584
               },
               "giveBath": "EMPTY"
            }
         },
         ...

这是 "filtered" 查询的结果:

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 8000,
      "max_score": 1,
      "hits": [
         {
            "_index": "bignibou",
            "_type": "advertisement",
            "_id": "AUs2T2lt3L5LNr7nkot2",
            "_score": 1,
            "_source": {
               "childcareWorkerType": "AUXILIAIRE_PARENTALE",
               "childcareTypes": [
                  "SOLE_CHARGE",
                  "OUT_OF_SCHOOL",
                  "BABY_SITTING"
               ],
               "address": {
                  "latitude": 48.8532558,
                  "longitude": 2.36584
               },
               "giveBath": "EMPTY"
            }
         },
         ....

那么两者有什么区别呢?

这与queriesfiltersmore information here)的区别有关。

在您的情况下,与 terms 查询不同,terms 过滤器:

  • 缓存
  • 不计算分数:所有匹配的文档都具有相同的 _score 1(查看您的结果)

因此,最大的区别是 filtered 查询将比 'plain' terms 查询更快。