Соответствие запроса для целого числа в упругом поиске с Laravel - PullRequest
0 голосов
/ 10 июля 2019

Я следовал этой статье для соединения laravel и ElasticSearch: https://madewithlove.be/how-to-integrate-your-laravel-app-with-elasticsearch/

У меня есть таблица в базе данных MySQL, в которой есть поле дерева: "title", "description" и "price". "title" и "description - это строковый тип. поэтому я пишу ниже код для поиска, и это работало правильно:

private function searchOnElasticsearch(string $query): array
{
    $instance = new Article;

    $items = $this->search->search([
        'index' => $instance->getSearchIndex(),
        'type' => $instance->getSearchType(),
        'body' => [
            'query' => [
                'multi_match' => [
                    'fields' => ['title', 'description'],
                    'query' => $query,
                ],
            ],
        ],
    ]);

    return $items;
}

Но теперь мне нужно проверить поле "цена", которое имеет тип bigInt , как два других поля: 'fields' => ['title', 'description','price'],

UPDATE

Когда я добавляю "price" в поле, я получаю эту ошибку в laravel:

{ "ошибка": { "ROOT_CAUSE": [{ "типа": "query_shard_exception", "причина": "не удалось создать запрос: {\ n \ "multi_match \": {\ n \ "query \": \ "bad \", \ n \ "fields \": [\ n \ "description ^ 1.0 \", \ n \ "price ^ 1.0 \", \ n \ "tags ^ 1.0 \", \ n \ "title ^ 1.0 \" \ n], \ n \ "type \": \ "best_fields \", \ n \ "operator \": \ "OR \", \ n \ "slop \": 0, \ n \ "prefix_length \": 0, \ n \ "max_expansions \": 50, \ n \ "zero_terms_query \": \ "NONE \", \ n \ "auto_generate_synonyms_phrase_query \": true, \ n \ "fuzzy_transpositions \": true, \ n \ "boost \": 1.0 \ n } \ П} " "index_uuid": "mm787GxMS4WjjjqwRD5YIw", "Индекс": "товары"}], "типа": "search_phase_execution_exception", "причина":" все осколки не удалось», "фазы": "запрос", "сгруппированы": правда, "failed_shards": [{ "осколок": 0, "Индекс": "товары", "узел": "JYWiIdbLQtu3aWkm_F-e9Q", "причина" : { "типа": "query_shard_exception", "причина": "не удалось создать запрос: {\ n \ "multi_match \": {\ n \ "query \": \ "bad \", \ n \ "fields \": [\ n \ "description ^ 1.0 \", \ n \ "price ^ 1.0 \", \ n \ "tags ^ 1.0 \", \ n \ "title ^ 1.0 \" \ n], \ n \ "type \": \ "best_fields \", \ n \ "operator \": \ "OR \", \ n \ "slop \": 0, \ n \ "prefix_length \": 0, \ n \ "max_expansions \": 50, \ n \ "zero_terms_query \": \ "NONE \", \ n \ "auto_generate_synonyms_phrase_query \": true, \ n \ "fuzzy_transpositions \": true, \ n \ "boost \": 1.0 \ n } \ П} " "index_uuid": "mm787GxMS4WjjjqwRD5YIw", "Индекс": "товары", "caused_by": { "Тип": "number_format_exception", "причина":" Для входная строка: \ "bad \" "}}}]}," status ": 400}

1 Ответ

1 голос
/ 10 июля 2019

Я предлагаю что-то вроде этого, то есть разделить запрос на две части, одну для текстовых полей и другую для числовых полей. Однако добавляйте совпадение в числовые поля только в том случае, если $query действительно число:

$body = [
    'query' => [
        'bool' => [
            'should' => [
                [
                   'multi_match' => [
                       'fields' => ['title', 'description'],
                       'query' => $query
                   ]
                ]
            ]
        ]
    ]
];

// if the query is numeric add an additional clause for the price field
if (is_numeric($query)) {
    $body['query']['bool']['should'][] = [ 'match' => [ 'price' => $query]];
}

$items = $this->search->search([
    'index' => $instance->getSearchIndex(),
    'type' => $instance->getSearchType(),
    'body' => $body
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...