Поиск с оператором "И" в пакете PHP Elastic search

Я пытаюсь научиться 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 работа в нем.

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

1 ответ

Решение

Попробуй это:

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

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

См. Это /questions/10652958/elasticsearch-raznitsa-mezhdu-dolzhnyim-i-dolzhnyim-bulevyim-zaprosom/10652964#10652964

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

"query": {
    "bool": {
      "must": [
        {
          "range": {
            "nits_url": {
              "gte": 1000,
              "lte": 10000
            }
          }
        },
        {
          "match": {
            "nits_account": "$account"
          }
        }
      ]
    }
  }
Другие вопросы по тегам