基于大多数匹配的查询的弹性搜索相关性

时间:2014-07-27 07:19:45

标签: elasticsearch sense

我有以下映射

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和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个东西而第二个只包含一个。 有人可以帮助使用正确的查询来根据大多数匹配对结果进行排序吗?

2 个答案:

答案 0 :(得分:2)

您的查询遇到的最大问题是您使用的是过滤器。因此,不计算得分。比使用match_all查询给所有文档得分为1.用查询替换过滤后的查询并使用bool查询而不是bool过滤器。

希望有所帮助。

答案 1 :(得分:1)

在过滤器上计算的分数不是使用嵌套查询:

{
    "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"
                               }
                           }]
                       }
                   }]
               }
           }
       }
   }
}