Database 按嵌套字段排序
我在elastic有一个这样的文档类型Database 按嵌套字段排序,database,
elasticsearch,Database,
elasticsearch,我在elastic有一个这样的文档类型 { "name": "Foo Bar", "myTags": [ { "id": 3, "name": "My tag 1" }, { "id": 5, "name": "My Tag 5" }, { "id": 7, "name": "My Tag 7" } ] } 现在,给定3个标记,我想按照匹配标记的数量对所有文档进行
{
"name": "Foo Bar",
"myTags": [
{
"id": 3,
"name": "My tag 1"
},
{
"id": 5,
"name": "My Tag 5"
},
{
"id": 7,
"name": "My Tag 7"
}
]
}
现在,给定3个标记,我想按照匹配标记的数量对所有文档进行排序。因此,首先是匹配所有3个标记的文档,而不是匹配2个标记的文档,然后是一个,最后是无标记的文档
我该怎么做 您可以使用
功能\u评分来完成:
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 1"
}
}
}
},
"weight": 1
},
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 5"
}
}
}
},
"weight": 1
},
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 7"
}
}
}
},
"weight": 1
}
],
"boost_mode": "sum",
"score_mode": "sum"
}
}
}
您可以使用功能\u分数来执行此操作
:
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 1"
}
}
}
},
"weight": 1
},
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 5"
}
}
}
},
"weight": 1
},
{
"filter": {
"nested": {
"path": "myTags",
"query": {
"term": {
"myTags.name": "My Tag 7"
}
}
}
},
"weight": 1
}
],
"boost_mode": "sum",
"score_mode": "sum"
}
}
}
您为此使用评分,并使用带有三(3)个标记的bool
语句should
语句,如果一个标记“匹配”(无论在您的用例中意味着什么),这些语句将增加评分。我们的想法是,如果一个标签匹配,它将增加分数。您为此使用计分,并使用带有三(3)个标签的bool
should
语句,如果一个标签“匹配”(无论在您的用例中意味着什么),它将增加分数。这个想法是,如果一个标签匹配,它将增加分数。我忘了提到我的弹性1.7.5。这个查询可以吗?它应该适用于1.7。其思想是,如果文档与其中一个标记匹配,则得分为+1。如果它匹配另一个标记,那么另一个+1,依此类推。基本上,最终的分数将是匹配标签的计数+1(从默认的match_all
默认查询)。我必须将weight:1
更改为weight:2
,否则,当只使用一个标签进行过滤时,我会得到奇怪/错误的结果。我忘了提到我使用的是Elastic 1.7.5。这个查询可以吗?它应该适用于1.7。其思想是,如果文档与其中一个标记匹配,则得分为+1。如果它匹配另一个标记,那么另一个+1,依此类推。基本上,最终得分将是匹配标记的计数+1(从默认的match\u all
默认查询)。我必须将weight:1
更改为weight:2
,否则,当只使用一个标记进行筛选时,我会得到奇怪/错误的结果。