我有以下文件:
{
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。
答案 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
}