Синтаксическая ошибка Elasticsearch с поиском в нескольких полях - PullRequest
0 голосов
/ 17 ноября 2018

Я смотрел Эластичные поиски, что нельзя, а что нельзя делать от Итамар Син Хершко

https://www.youtube.com/watch?v=c9O5_a50aOQ

Я вижу несколько условийв нескольких полях на следующем изображении:

https://imgur.com/a/17zAZ4w

Я попытался сделать это в своем приложении Laravel 5.7 (с плагиномasticsearch /asticsearch), как показано вследующий код:

$elasticQuery = [
    "bool" => [
        'must'   => [
            'multi_match' => [
                'query'  => $text,
                'fields' => ['name^4', 'description']
            ],
        ],
        "should" => [
            'term' => [
                "category_id" => 1,
            ]
        ]
    ]
];

но я получил ошибку:

{"error":{"root_cause":[{"type":"parsing_exception","reason":"[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":130}],"type":"parsing_exception","reason":"[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]","line":1,"col":130},"status":400}

Но когда я использую простое условие:

        $elasticQuery = [
            'multi_match' => [
                'query' => $text,
                'fields' => ['name^4', 'description'],
            ],
        ];

я получил правильный результат:

[hits] => Array
    (
        [total] => 1
        [max_score] => 7.4126062
        [hits] => Array
            (
                [0] => Array
                    (
                        [_index] => select_vote
                        [_type] => vote
                        [_id] => 16
                        [_score] => 7.4126062
                        [_source] => Array
                            (
                                [id] => 16
                                [slug] => in-the-film-babe-what-type-of-animal-was-babe
                                [name] => In the film Babe, what type of animal was Babe?
                                [description] => Babe is a 1995 A...
                                [created_at] => 2018-11-10 09:14:15
                                [category_id] => 2
                                [category] => Array
                                    (
                                        [name] => Movie&Cartoons
                                        [slug] => movie-cartoons
                                        [created_at] => 2018-11-10 09:14:12
                                    )

                            )

                    )

            )

    )

это правильный формат для нескольких запросов?

МОДИФИЦИРОВАННЫЙ БЛОК # 2: Выполнение поиска показалось мне работоспособным:

$elasticQuery = [
    "bool" => [
        'should' => [


                [
                        "multi_match" => [
                            "query"  => $text,
                            "type"   => "cross_fields",
                            "fields" => [
                                "name^4",
                                "description"
                            ]
                        ]
                ],

                [
                    'match' => [
                        'category_id' => [
                            'query' => 1,
                        ]
                    ]
                ],

                [
                    'match' => [
                        'category_id' => [
                            'query' => 3,
                        ]
                    ]
                ],

        ]
    ]
];

, когда мне нужно выполнить поиск по текстовым полям и массиву категории (1 и 3) в примеревыше он работает, но выглядит так, как будто он работает как условие «ИЛИ», но мне нужно сделать ограничение типа «И», используя терминологию SQL ...

Какой способ является правильным, чтобы сделать ограничение как«И»?

Спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Если вы просто измените should на must, это не сработает, потому что category_id не может иметь два значения одновременно (если это не массив, но это не так).

Вам нужно использовать следующий запрос:

$elasticQuery = [
"bool" => [
    'must' => [
            [
                    "multi_match" => [
                        "query"  => $text,
                        "type"   => "cross_fields",
                        "fields" => [
                            "name^4",
                            "description"
                        ]
                    ]
            ],
    ],
    'filter' => [
            [
                'terms' => [
                    'category_id' => [ 1, 3 ]
                ]
            ]
    ]
]
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...