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

Elasticsearch和PHP。在一个查询中组合match和multi\u match

慕容成文
2023-03-14

我有三个字段-一个是整数类型(field1),两个是十进制类型(field2,field3)。我希望能够按所有字段进行查询。在我的情况下,这些单独的查询非常有效:

$params = [
    'index' => 'test_index',
    'type' => 'text_index_type',
    'body' => [
        'query' => [
            'match' => [
                'field1' => '12'
            ]
        ]
    ]
];

这个查询运行良好:

$params = [
    'index' => 'test_index',
    'type' => 'text_index_type',
    'body' => [
        'query' => [
            'multi_match' => [
                'query' => '345',
                'fields' => ['field2', 'field3']
            ]
        ]
    ]
];

但是,如果我将它们结合起来:

$params = [
    'index' => 'test_index',
    'type' => 'text_index_type',
    'body' => [
        'query' => [
            'match' => [
                'field1' => '12'
            ],
           'multi_match' => [
                'query' => '345',
                'fields' => ['field2', 'field3']
            ]
        ]
    ]

];

我得到一个错误:

未捕获的异常'Elasticsearch\Common\Exceptions\BadRequest est400Exception'...[匹配]格式错误的查询,意外的[FIELD_NAME]找到[multi_match]

那么,这有什么问题,我该如何解决呢?

附言。就SQL而言,这是我想要实现的:

 SELECT * FROM mytable where field1 = 12 or field2 = 345 or field3 = 345

共有1个答案

郑卜鹰
2023-03-14

您可以将它们与bool查询结合起来

$params = [
    'index' => 'test_index',
    'type' => 'test_index_type',
    'body' => [
        'query' => [
            'bool' => [
                'should' => [
                    [ 'match' => [ 'field1' => '12' ] ],
                    [ 'multi_match' => [ 'query' => '345',
                                         'fields' => ['field2', 'field3']] ],
                ]
            ]
        ]
    ]
];

应该等同于“或”,而必须等同于“与”

 类似资料:
  • 我有一个elasticsearch索引用于存储关于人的信息。为了找到特定的人,我有一些查询,每个查询都单独工作,但是当我使用Bool查询将它们组合起来时,我会得到一个错误。 其中一个查询是对名称的模糊搜索 另一个查询用于搜索在特定日期范围内出生的人 现在我想组合这两个查询。我的bool查询: 虽然当我单独使用它们时,这两个查询都工作得很好,但当把它们组合起来时,我会得到一个错误。我的索引中有名字是

  • 也许查询过滤器不正确?(我尝试了几个选项都没有成功) 错误:{“错误”:“SearchPhaseExecutionException[未能执行阶段[query],总失败;shardFailures{[AS6HqxgNRtyU9-pQKhJsXQ][IDX_Cerception][3]:SearchParseException[[IDX_Cerception][3]:From[-1],大小[-1]:

  • 问题内容: 我目前正在使用ElastSearch查询,该查询当前看起来如下所示: 因此,现在当条件1或条件2匹配时,将忽略文档。查询的外观如何,以便仅忽略符合条件1和条件2的文档? 问题答案: 由于不可能更新elasticsearch版本,因此我不得不找到另一个解决方案。这对我有用:

  • 问题内容: 我想使用ES进行图书搜索。因此,我决定将作者姓名和标题(作为嵌套文档)放入索引,如下所示: 我不明白的是:如何构造搜索查询,以便在搜索“一二”时仅找到第二本书,而在搜索“二三”时什么也找不到,而在搜索“一”时所有图书呢? 问题答案: 也许是这样的? 该查询基本上说一个文件必须有and 。您可以轻松地重新配置该查询。例如,如果您只想搜索作者,请删除嵌套部分。如果您想要另一本书,请更改嵌套

  • 问题内容: 我有两种日志消息: 第一个消息是已发送消息的类型,第二个消息是确认消息已传递的消息。 它们之间的区别是后缀,我已将其与“ id”分开并可以对其进行查询。 这些消息将按以下格式解析并存储在elasticsearch中: 我想找出哪些消息已成功发送,哪些没有成功。我是Elasticsearch的初学者,所以我真的很努力。 我目前正在尝试术语聚合,但是我所能实现的就是以下代码: 向我显示已发

  • 我有两个搜索词“86746184549”和“3302093809”。我正在执行两个单独的术语查询,以获取与每个ID匹配的一个文档。 和 我认为terms查询在这里不起作用,因为它不会返回包含不同字段的文档。 我之所以要组合查询是因为,假设我有100个这样的术语,那么我将打100个电话!!到elasticsearch服务器。