如何在elasticsearch嵌套函数Score函数中应用过滤器

r7xajy2e  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(464)

为了根据字段值控制文档的分数,我在dsl查询中使用filter with function\u score,这将获得预期的结果。
然而,在巢穴中实现这一点,结果却不尽相同;分数不应用于筛选器值。通过进一步调查,我发现scorefunctionsdescriptor不支持某些版本的c#nest filter。还是这样吗?你能帮我用一个工作选项来实现这个嵌套吗(我是ElasticSearch和c的新手,所以请原谅,如果这是一个noob问题)。
我目前正在使用ElasticSearchV7.6和nest v7.5.1。
谢谢!
dsl查询

GET /help/_search
{
  "query":{
   "function_score": {
     "query": {
     "bool": {
      "must": [
        {
          "multi_match": {
            "query": "AGC",
            "fields": [
              "title^2",
              "description^1"
            ],
            "type":"most_fields",
            "fuzziness": "AUTO:4,8",
            "prefix_length": 2,
            "boost": 5            
          }
        }
        ]
  }
  },

**"functions": [

   { 
    "filter": {
     "term":{
       "product":"A"
            }
              },
        "weight": 45
    },
   { 
    "filter": {
     "term":{
       "product":"B"
            }
              },
        "weight": 20
    },
   { 
    "filter": {
     "term":{
       "product":"C"
            }
              },
        "weight": 10
    }
       ],**
    "score_mode": "max",
    "boost_mode": "multiply"    
}
}
}```
jaql4c8m

jaql4c8m1#

通过进一步调查,我发现scorefunctionsdescriptor不支持某些版本的c#nest filter。还是这样吗?
你要找的函数是一个应用了过滤器的权重函数。这在客户端已经支持了很长一段时间。
客户机等价物应该是

var response = client.Search<object>(s => s
    .Query(q => q
        .FunctionScore(fs => fs
            .Query(fsq => fsq
                .Bool(b => b
                    .Must(mu => mu
                        .MultiMatch(mm => mm
                            .Query("AGC")
                            .Fields(new[] { "title^2", "description^1" })
                            .Type(TextQueryType.MostFields)
                            .Fuzziness(Fuzziness.AutoLength(4,8))
                            .PrefixLength(2)
                            .Boost(5)
                        )
                    )
                )
            )
            .Functions(fu => fu
                .Weight(w => w
                    .Filter(f => f
                        .Term("product", "A")
                    )
                    .Weight(45)
                )
                .Weight(w => w
                    .Filter(f => f
                        .Term("product", "B")
                    )
                    .Weight(20)
                )
                .Weight(w => w
                    .Filter(f => f
                        .Term("product", "C")
                    )
                    .Weight(10)
                )
            )
            .ScoreMode(FunctionScoreMode.Max)
            .BoostMode(FunctionBoostMode.Multiply)
        )
    )
);

有几件事你可能想看看: description^1 可以用简单的 description 因为默认的boost是1
这可以更好地用 bool 查询方式 should 用于每个weight函数中每个查询的子句,并应用类似于weight使用方式的增强。像这样的

var response = client.Search<object>(s => s
    .Query(q => q
        .Bool(b => b
            .Must(mu => mu
                .MultiMatch(mm => mm
                    .Query("AGC")
                    .Fields(new[] { "title^2", "description^1" })
                    .Type(TextQueryType.MostFields)
                    .Fuzziness(Fuzziness.AutoLength(4, 8))
                    .PrefixLength(2)
                    .Boost(5)
                )
            )
            .Should(
                sh => sh.Term(t => t
                    .Field("product")
                    .Value("A")
                    .Boost(45)
                ),
                sh => sh.Term(t => t
                    .Field("product")
                    .Value("B")
                    .Boost(20)
                ),
                sh => sh.Term(t => t
                    .Field("product")
                    .Value("C")
                    .Boost(10)
                )
            )
        )
    )
);

相关问题