当使用elasticsearch-7时,我对es复合查询语法感到困惑。
虽然反复阅读es文档,但我只找到标准语法的布尔值或常量得分。
正如它所说明的,我理解什么是‘查询上下文’和什么是‘筛选上下文’,但是当将这两种查询类型组合在一个查询中时,我不知道它是什么意思。
让我们看看一个例子:
GET /classes_test/_search
{
"size": "21",
"query": {
"constant_score": {
"filter": {
"bool": {
"must": [
{
"match": {
"class_name": "29386556"
}
}
],
"should": [
{
"term": {
"master": "7033560"
}
},
{
"term": {
"assistant": "7033560"
}
},
{
"term": {
"students": "7033560"
}
}
],
"minimum_should_match": 1,
"must_not": [
{
"term": {
"class_id": 0
}
}
],
"filter": [
{
"term": {
"class_status": "1"
}
}
]
}
}
}
}
}可以执行此查询,响应内容中的响应well.Each项具有1.0的“_score”值。
那么,这是否意味着子bool查询作为一个整体在一个过滤器上下文中,尽管它有一个“必须”和“应该”?
另外,我发现布尔查询可以有一个常量分数子查询。
为什么es允许这些语法,但没有更多的词来解释?
发布于 2019-12-02 09:29:23
如果使用constant_score查询,则不会获得与1.0不同的分数,除非指定boost参数,在这种情况下,分数将与之匹配。
如果你需要得分,你显然需要抛弃constant_score。
在您的示例中,match对class_name的查询不能产生除1或0以外的任何其他分数,因为这基本上是一个是/否筛选器,而不是基于全文搜索的匹配。
总之,由于不依赖全文搜索,所以所有查询都在过滤器上下文中执行(因此得分为0或1)。因此,无论何时使用全文搜索,都会得到评分,而不是因为使用了match查询。在您的示例中,可以将所有must约束合并到filter中,这不会产生任何影响,因为您只有筛选器(是/否匹配)和没有全文搜索。
https://stackoverflow.com/questions/59135779
复制相似问题