当前位置: 首页 > 知识库问答 >
问题:

弹性搜索--布尔查询中带有过滤器的问题

松建本
2023-03-14

我在布尔查询中有一个筛选器问题。

我想应用一个基于3个字段的筛选器,其中至少有1个筛选器匹配:

$params = [
    'from' => 0,
    'size' => 25,
    'index' => 'document',
    'body' => [
        'query' => [
            'bool' => [
                'filter' => [
                    'bool' => [
                        'minimum_should_match' => 1,
                        'should' => [
                            'term' => [
                                'VISIBILITE' => 'T'
                            ],
                            'term' => [
                                'ECRITURE' => 'M'
                            ],
                            'term' => [
                                'LECTURE' => 'M'
                            ],
                        ]
                    ]
                ],
                'must' => [
                    [
                        'bool' => [
                            'should' => [ 
                                [
                                    'match' => [
                                        'OBJET' => $recherche,
                                    ]
                                ],
                            ] 
                        ]
                    ],
                ],
            ],
        ],
    ],
];

我在这个查询中没有得到任何结果,但是我在索引中看到了很多相关的文档。

Opster Elasticsearch忍者测试:

例如你向我提出的1个例子,我有许多返回的结果。

然而,当我想对对象字段执行必须查询时,我没有得到与筛选器完美匹配的相同结果。

这里有一个例子:

  1. 仅使用must子句进行搜索
{
    "took": 8,
    "timed_out": false,
    "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1268,
            "relation": "eq"
        },
        "max_score": 13.616098,
        "hits": [
            {
                "_index": "document",
                "_type": "_doc",
                "_id": "26685",
                "_score": 13.616098,
                "_source": {
                    "NUMDOCUMENT": "26685",
                    "TYPEDOCUMENT": "Proc\u00e9dure",
                    "OBJET": "Proc\u00e9dure d'importation des index dans Marco 2",
                    "MOTCLES": "",
                    "LECTURE": "S",
                    "VISIBILITE": "T", // Must match on second search
                    "ECRITURE": "M" // Must match on second search
                }
            }
        ]
    }
}
{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 10000,
            "relation": "gte"
        },
        "max_score": 0,
        "hits": [
            {
                "_index": "document",
                "_type": "_doc",
                "_id": "431",
                "_score": 0,
                "_source": {
                    "NUMDOCUMENT": "431",
                    "TYPEDOCUMENT": "Document",
                    "OBJET": "Diagnostic informatique SAFC",
                    "LECTURE": "M",
                    "VISIBILITE": "T",
                    "ECRITURE": "M"
                }
            }
        ]
    }
}

首先出现的不再是同一文档(尽管该文档与筛选器相对应)。这就好像搜索过滤器影响了分数和相关性的搜索必须。

共有1个答案

章翔宇
2023-03-14

问题似乎与bool查询有关,如果您在顶层查看查询,您有两个构造

>

  • 筛选块,它具有3个should条件,其中至少有1个条件应该匹配,这将筛选即减少将在其上执行下一个must子句的文档集。

    必须阻止,我怀疑没有匹配从步骤1的缩减文档集上的任何东西,这导致您的查询没有返回任何东西。

    为了调试该问题,您应该单独尝试第一个块,然后在合并时再尝试,看看是否得到结果,因为您的must块没有正确的数据,我创建了以下示例,显示如果您有正确的数据,它将返回数据:

    {
        "query": {
            "bool": {
                "should": [
                    {
                        "term": {
                            "VISIBILITE": "T"
                        }
                    },
                    {
                        "term": {
                            "ECRITURE": "T"
                        }
                    },
                    {
                        "term": {
                            "LECTURE": "T"
                        }
                    }
                ],
                "minimum_should_match": 1
            }
        }
    }
    

    和搜索查询结果,显示匹配单据的_source

    "hits": [
                {
                    "_index": "minshouldmatch",
                    "_type": "_doc",
                    "_id": "2",
                    "_score": 1.5686158,
                    "_source": {
                        "VISIBILITE": "T", 
                        "ECRITURE": "T",
                        "LECTURE": "T"
                    }
                },
                {
                    "_index": "minshouldmatch",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 0.18232156,
                    "_source": {
                        "VISIBILITE": "T", // note even only 1 condition matches still it comes in SR
                        "ECRITURE": "M",
                        "LECTURE": "M"
                    }
                }
            ]
    

  •  类似资料:
    • 不带筛选器的查询: 当我用curl:curl-w'\ntime_total:%{time_total}\n'-h'content-type:application/json'-xget-d‘{}':9200/store/msg/_search?routing=user1来度量这两个查询的性能时 不带筛选器的查询得到的总时间:1.134、1.237、1.107,带筛选器的查询时间:1.322、1.4

    • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

    • 我正在使用以下搜索: 我现在想使用弹性搜索在索引过程中提供的id ()来过滤结果。例如,{}。我猜你得用查询这个词。结果应该是只有当< code>_id匹配时,文档才返回。我该怎么做呢?

    • 在Udemy教程中,我在这里遇到了这个查询: 我想知道是否有可能优化它?我在想两种可能的方法: > 将“流派”放入筛选器上下文中。但是一部电影可能有多种类型,所以我不确定使用type关键字和filter-term是否能在那里工作。 直接将“must_not”放在过滤器上下文中(没有bool)是行不通的,因为据我所知,过滤器不允许“过滤掉”,只允许“过滤保留什么”。但是如果我将must_not包装在

    • 我有一份这样的文件 下面是我到目前为止所尝试的

    • 我有一个查询,它从弹性索引中获取一些用户帖子数据。我对那个查询很满意,尽管我需要让它返回具有唯一用户名的行。当前,它显示用户的相关帖子,但它可能会显示一个用户两次... 我读过关于聚合的文章,但不太了解(也尝试过使用AGG,但也不起作用)。。。。感谢您的帮助