我有一个下面的映射
posts":{
"properties":{
"prop1": {
"type": "nested",
"properties": {
"item1": {
"type": "string",
"index": "not_analyzed"
},
"item2": {
"type": "string",
"index": "not_analyzed"
},
"item3": {
"type": "string",
"index": "not_analyzed"
}
}
},
"name": {
"type": "string",
"index": "not_analyzed"
}
}
}
考虑对这些映射
进行如下索引的对象{
"name": "Name1",
"prop1": [
{
"item1": "val1",
"item2": "val2",
"item3": "val3"
},
{
"item1": "val1",
"item2": "val5",
"item3": "val6"
}
]
}
和另一个对象
{
"name": "Name2",
"prop1": [
{
"item1": "val2",
"item2": "val7",
"item3": "val8"
},
{
"item1": "val12",
"item2": "val9",
"item3": "val10"
}
]
}
现在假设我想搜索具有prop1的文档。Item1的值为"val1"或"val2"。我还希望以这样一种方式对结果进行排序,即同时具有"val1"one_answers"val2"的文档比仅具有"val1"或"val2"中的一个的文档具有更多的分数。
我已经尝试了以下查询,但似乎没有得分基于比赛的数量
{
"query": {
"filtered": {
"query": {"match_all": {}},
"filter": {
"nested": {
"path": "prop1",
"filter": {
"or": [
{
"and": [
{"term": {"prop1.item1": "val1"}},
{"term": {"prop1.item2": "val2"}}
]
},
{
"and": [
{"term": {"prop1.item1": "val1"}},
{"term": {"prop1.item2": "val5"}}
]
},
{
"and": [
{"term": {"prop1.item1": "val12"}},
{"term": {"prop1.item2": "val9"}}
]
}
]
}
}
}
}
}
}
现在,虽然它应该给出两个文档,但第一个文档应该有更多的分数,因为它包含过滤器中的2个东西,而第二个文档只包含一个。有人可以帮助正确的查询,以获得基于大多数匹配排序的结果?
您在查询中遇到的最大问题是您正在使用过滤器。因此不计算分数。然后使用match_all查询,该查询给所有文档打分为1。将过滤后的查询替换为查询,并使用bool查询代替bool过滤器。
希望对你有帮助。
在过滤器上不计算分数,而是使用嵌套查询:
{
"query": {
"nested": {
"score_mode": "sum",
"path": "prop1",
"query": {
"bool": {
"should": [{
"bool": {
"must": [{
"match": {
"prop1.item1": "val1"
}
},
{
"match": {
"prop1.item2": "val2"
}
}]
}
},
{
"bool": {
"must": [{
"match": {
"prop1.item1": "val1"
}
},
{
"match": {
"prop1.item2": "val5"
}
}]
}
},
{
"bool": {
"must": [{
"match": {
"prop1.item1": "val12"
}
},
{
"match": {
"prop1.item2": "val9"
}
}]
}
}]
}
}
}
}
}