根据布尔字段提升结果

时间:2019-10-01 15:50:34

标签: node.js elasticsearch

我在各家商店都有大量物品。这些文章中有一些是自有品牌文章,在我的Elasticsearch搜索结果中应该比其他文章排名更高(但是,应同时显示自有品牌和非自有品牌。)

我已经尝试过使用field_value_factor进行其他处理,但是对于布尔型字段似乎不太适合。 我还在autoCompleteExample中尝试了方法,但这对我来说效果不佳。与其他非ownBrand文章相比,ownBrand方法的结果排名仍然较低。

索引:

schema: {
    articleId: { type: 'text' },
    brandId: { type: 'text' },
    brandName: { type: 'text' },
    countryId: { type: 'text' },
    description: { type: 'text' },
    isOwnBrand: { type: 'boolean' },
    stores: { type: 'keyword' },
  },
};

查询:

      query: {
          function_score: {
            query: {
              bool: {
                must: {
                  multi_match: {
                    query: searchterm,
                    fields: ['name^5', 'name.ngram'],
                    fuzziness: 'auto',
                    prefix_length: 2,
                  },
                },
                filter: [{ term: { stores: storeId } }],
              },
            },
          },
        },
      };

结果应优先显示顶部isOwnBrand = true的字段,同时仍在下面显示isOwnBrand = false的相关文章。

我对如何处理这个问题感到迷茫。

1 个答案:

答案 0 :(得分:0)

您可以使用Field Value factor。即使在布尔字段上,下面也应该可以正常工作。试试

{
    "query": {
        "function_score": {
           "query" {...}, #your normal query as in question
            #add below after query
            "field_value_factor": {
                "field": "isOwnBrand",
                "factor": 1.2,
                "modifier": "sqrt",
                "missing": 1
            }
        }
    }
}

我可以想到但尚未测试的一个警告-由于false0,上述脚本会将所有分数为0的文档打分,这会打乱得分。您可以将isOwnBrand设为数字字段,然后设置优先级从1开始

或者您也可以使用script_score