是否可以根据自定义重量值计算使用过滤时的匹配数量?

时间:2015-08-28 08:30:58

标签: elasticsearch

例如,我有索引pizzas。我有Bool过滤器

 "bool": {
      "should": {
          "toppings": [
            {
              "query": "Tomatoes"
            },
            {
              "query": "Mushrooms"
            }
          ]
        }
      }

ElasticSearch可以为索引中的所有比萨返回匹配百分比,因此所有具有mushrooms XOR tomatoes的比例将返回50%,如果两者都是100%。和其他配料无关。

如果是,我们可以通过这种方式扩展此功能,因此我们可以为每个顶部重量值添加。 例如,我对西红柿(50),蘑菇(75)和辣椒(100)感兴趣。 总而言之,它将是50 + 75 + 100 = 225 所以Margherita的西红柿和Muchrooms = 125。 所以这个披萨匹配百分比应该回到56%(125/225)附近。

我阅读了ElasticSearch指南,阅读了数百次API文档,尝试了过滤器,查询,minimum_should_match,boost。我将非常感谢至少在哪里进一步搜索。

1 个答案:

答案 0 :(得分:0)

我可以看到三种不同的方法来执行这个

命名查询

您可以在bool中使用named query,查看与每个文档匹配的所有查询。在客户端,您可以计算每个顶部的值并自己找到总和。

功能评分查询

{
  "query": {
    "function_score": {
      "filter": {
        "terms": {
          "toppings": [
            "Tomatoes",
            "Mushrooms",
            "chillies"
          ]
        }
      },
      "functions": [
        {
          "weight": 100,
          "filter": {
            "toppings": "chillies"
          }
        },
        {
          "weight": 50,
          "filter": {
            "toppings": "Tomatoes"
          }
        },
        {
          "weight": 75,
          "filter": {
            "toppings": "Mushrooms"
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "replace"
    }
  }
}

在上述文件中,辣椒或西红柿或蘑菇将匹配。对于存在的任何过滤器,它将创建一个增强值并添加它。因此,函数给出的分数是您要查找的总和。现在这被查询分数取代。因此,文件的分数将是您要查找的数字。

脚本字段方法

您需要使用script field。这将为每个文档创建一个额外的字段,使用脚本

计算您要查找的总和