Elasticsearch - 使用加权类型的筛选查询

时间:2015-08-03 13:55:19

标签: elasticsearch elasticsearch-query

我继承了一个我试图修改的Elasticsearch查询。我目前的查询是:

{
  "fields": [

  ],
  "from": 0,
  "size": 51,
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "fields": [
            "data.*"
          ],
          "default_operator": "AND",
          "query": "*Search term*"
        }
      },
      "filter": [
        {
          "terms": {
            "type": [
              "typeOne",
              "typeTwo",
              "typeThree"
            ]
          }
        }
      ]
    }
  }
}

现在我一直在尝试做的是在结果中提升其中一个术语,但未能使其工作。我已经尝试添加一个“提升”值,但这奇怪地给了我相反的效果 - 它禁用任何提升的类型。

我尝试了以下“过滤器”对象:

"filter": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "type": "typeOne"
                }
              },
              {
                "term": {
                  "type": "typeTwo"
                }
              },
              {
                "term": {
                  "type": "typeThree",
                  "boost": 2
                }
              }
            ]
          }
        }
      ]

但正如我之前所说的那样,它不会提升“typeThree”,而是从结果中删除所有“typeThree”。

任何人都可以帮助我提升特定的术语类型吗?

2 个答案:

答案 0 :(得分:1)

有多种方法可以构建查询来实现上述目标,一种方法是使用function_score。它会在这些行上看到一些东西

示例:

"query": {
      "function_score": {
         "functions": [
            {
               "filter": {
                  "term": {
                     "type": "typeThree"
                  }
               },
               "weight": 2
            }
         ],
         "score_mode": "sum",
         "boost_mode": "sum",
         "query": {
            "filtered": {
               "query": {
                  "query_string": {
                     "fields": [
                        "data.*"
                     ],
                     "default_operator": "AND",
                     "query": "*search term*"
                  }
               },
               "filter": [
                  {
                     "terms": {
                        "type": [
                           "typeOne",
                           "typeTwo",
                           "typeThree"
                        ]
                     }
                  }
               ]
            }
         }
      }
   }

您可以启用explain来查看这会如何影响评分

答案 1 :(得分:1)

虽然keety的回答是98%的回答,但需要一些额外的谷歌搜索来完成所有这些。问题是"体重"在这里不起作用,你必须使用" boost_factor"。最终查询如下所示:

{
    "fields": [

    ],
    "from": 0,
    "size": 51,
    "query": {
        "function_score": {
            "functions": [
                {
                    "filter": {
                        "term": {
                            "type": "typeOne"
                        }
                    },
                    "boost_factor": 1.2
                },
                {
                    "filter": {
                        "term": {
                            "type": "typeTwo"
                        }
                    },
                    "boost_factor": 1.1
                },
                {
                    "filter": {
                        "term": {
                            "type": "typeThree"
                        }
                    },
                    "boost_factor": 1
                }
            ],
            "score_mode": "sum",
            "boost_mode": "sum",
            "query": {
                "filtered": {
                    "query": {
                        "query_string": {
                            "fields": [
                                "data.*"
                            ],
                            "default_operator": "AND",
                            "query": "*search term*"
                        }
                    },
                    "filter": [
                        {
                            "terms": {
                                "type": [
                                    "typeOne",
                                    "typeTwo",
                                    "typeThree"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }
}