Поиск с оператором «И» в пакете Elasti c search PHP - PullRequest
2 голосов
/ 26 января 2020

Я пытаюсь выучить Elastic Search с помощью пакета php composer. У меня есть index с именем media_data, которое содержит поля nits_account, nits_url, session_id, timestamp. Я хочу иметь фильтры на основе вышеуказанных полей, и он должен быть в and операторе. мой текущий код запроса:

$items = $this->elasticsearch->search([
    'index' => $index_name,
    'body'  => [
        'query' => [
            'filtered' => [
                'filter' => [
                    'and' => [
                        ['match' => ['nits_account' => 'xyzABCD2190-aldsj']],  //API Key
                        ['match' => ['nits_url' => 'google.com']],
                    ]
                ]
            ]
        ]
    ]
]);

Мой вопрос:

  1. Я не могу получить данные. Но если я сделаю код ниже:

    $items = $this->elasticsearch->search([
        'index' => $index_name,
        'body'  => [
            'query' => [
                 'bool' => [
                    'should' => [
                        ['match' => ['nits_account' => $account] ],
                        ['match' => ['nits_url' => $domain] ],
                    ],
                ], 
            ]
        ]
    ]);
    

, я получу значения в or операторах, но мне потребуется операция and.

Как я могу иметь различные операции поиска с соответствующими полями, я хочу иметь поле nits_account для точного соответствия, я хочу иметь nits_url с операциями типа / с подстановочными знаками, отметка времени должна быть сопоставимой (больше чем / меньше чем / между двумя датами).

1 Ответ

1 голос
/ 26 января 2020

Попробуйте:

$items = $this->elasticsearch->search([
    'index' => $index_name,
    'body'  => [
        'query' => [
             'bool' => [
                'must' => [
                    ['match' => ['nits_account' => $account] ],
                    ['match' => ['nits_url' => $domain] ]
                ],
            ], 
        ]
    ]
]);

Вы должны использовать ключевое слово must, а не should. must действует как И операция, в то время как should действует как ИЛИ операция.

См. Это { ссылка }

если вам нужно использовать условное совпадение, используйте что-то вроде этого:

"query": {
    "bool": {
      "must": [
        {
          "range": {
            "nits_url": {
              "gte": 1000,
              "lte": 10000
            }
          }
        },
        {
          "match": {
            "nits_account": "$account"
          }
        }
      ]
    }
  }
...