通过过滤数组的大多数匹配进行弹性排序

时间:2015-09-28 10:45:30

标签: sorting filter elasticsearch

我有以下文件:

{
  id : 1,
  title : One,
  tags : {
    {id : 1, title : One},
    {id : 2, title : Two},
    {id : 3, title : Three},
  }
},
{
  id : 2,
  title : Two,
  tags : {
    {id : 1, title : One},
    {id : 4, title : Four},
    {id : 5, title : Five},
  }
},
{
  id : 3,
  title : Three,
  tags : {
    {id : 1, title : One},
    {id : 2, title : Two},
    {id : 4, title : Four},
  }
}

我按第一项tags.id过滤:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": {
            "ids": {
              "values": [1]
            }
          },
          "should": [
            {
              "term": {
                "tags.id": "1"
              }
            },
            {
              "term": {
                "tags.id": "2"
              }
            },
            {
              "term": {
                "tags.id": "3"
              }
            }
          ]
        }
      }
    }
  },
  "track_scores": true,
  "size": 20,
  "sort": {
    "_score": "desc"
  }
}

有没有办法让大多数匹配标签排序?在这种情况下,项目(2场比赛)应首先,然后项目两个(1场比赛)。
似乎如果我在没有查询的情况下使用过滤器,则所有项目的得分均为1。

2 个答案:

答案 0 :(得分:0)

这个怎么样:

{
    "query" : {
        "bool": {
            "must_not": {
                "ids": {
                    "values": [1]
                }
            },
            "should": [
                {
                    "constant_score" : {
                        "filter" : {
                            "term": {
                                "tags.id": "1"
                            }
                        }
                    }
                },
                {
                    "constant_score" : {
                        "filter" : {
                            "term": {
                                "tags.id": "2"
                            }
                        }
                    }
                },
                {
                    "constant_score" : {
                        "filter" : {
                            "term": {
                                "tags.id": "3"
                            }
                        }
                    }
                }
            ]
        }
    }
}

此查询将确保id = 1的记录不在结果上,并且结果是有序的,以便具有更多匹配标记的结果位于结果之前,匹配标记更少。

根据您在目前为止提供的说明中所寻找的内容,我认为filtered查询不是必需的。 must_not子句将过滤掉不需要的结果。 bool查询及其默认值将处理您想要的顺序。

答案 1 :(得分:0)

@ eemp的答案可能也会起作用,但我更愿意尽可能保留过滤器,因此不会考虑分数。所以我移动了tgas过滤器进行查询。

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": {
            "ids": {
              "values": [1]
            }
          }
        }
      },
      "query": {
        "bool": {
          "should": [
            {
              "term": {
                "tags.id": "1"
              }
            },
            {
              "term": {
                "tags.id": "2"
              }
            },
            {
              "term": {
                "tags.id": "3"
              }
            }
          ]
        }
      }
    }
  },
  "size": 20
}