【问题标题】:Adding boost to Elasticsearch query为 Elasticsearch 查询添加提升
【发布时间】:2015-09-10 16:47:13
【问题描述】:

我正在尝试为 Elasticsearch 的某些结果增加权重。

我目前仅过滤“活动”布尔值以仅获取已发布的项目:

    query: {
      filtered: {
        query: {
          match: {
            _all: params[:q]
          }
        },
        filter: {
          term: {
            active: true
          }
        }
      },
    }

我现在想为我的一些模型增加重量。例如,市场应该获得 +2 提升。我正在尝试这样的事情:(search_type 是我结果中的一个字段,它基本上是 Rails 模型名称)

POST _search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "_all": "hospitality"
        }
      },
      "functions": [
          {
            "filter": {
            "term": {
              "active": true
            }
          }
          },
          {
            "filter": {
                "term": {
                    "search_type": "Market"   
                }
            },
            "weight": 2
          }
      ]
    }
  }
}

但是,这似乎不起作用:“函数列表中的一个条目缺少一个函数”。所以我在有源过滤器中添加了"weight": 1。但现在它说它无法解析。

我没有使用 ElasticSearch 的经验,文档也很混乱。我也尝试过使用 custom_filters_score 的东西,但这似乎不适用于我的 ES 版本(如此处所述:http://jontai.me/blog/2013/01/advanced-scoring-in-elasticsearch/)。我尝试的另一个选项是将布尔查询与 must 和 should 结合起来,但返回的结果为零......

不确定如何继续。一些见解会很棒。

【问题讨论】:

    标签: elasticsearch elasticsearch-rails


    【解决方案1】:

    您应该能够在功能分数旁边使用filtered query 来实现此目的

    例子:

    {
       "query": {
          "filtered": {
             "query": {
                "function_score": {
                   "query": {
                      "match": {
                         "_all": "hospitality"
                      }
                   },
                   "functions": [
                      {
                         "filter": {
                            "term": {
                               "search_type": "Market"
                            }
                         },
                         "weight": 2
                      }
                   ]
                }
             },
             "filter": {
                "term": {
                   "active": true
                }
             }
          }
       }
    }
    

    【讨论】:

    • 嘿,谢谢。我会试试的。如果我想添加更多 search_type 过滤器,只是添加它们,还是我需要类似 OR 过滤器的东西(不确定它是否存在?)例如,我想提升权重为 2 的市场和组件,新闻帖子的权重为 1.5,其他内容为 1.2。
    • 如果 search_type 是互斥的,您可以在函数数组中添加更多过滤器,否则它们将获得与类别关联的权重,如果不是,您可以使用 score_mode 来调整文档的提升应该添加多个search_type,乘以avg等
    • 嘿,我得到了查询,但似乎没有应用提升?我的意思是看到分数领域的提升吗?例如,我的最高结果是:“_score=0.17093952”。这是一个市场,我给它的权重为 3。感谢您帮助我,我对此一无所知。
    • 您可以打开explain 以检查是否已应用权重。默认情况下,函数得分与匹配得分相乘。
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多