Поисковая система PHP

1

Как можно сделать следующий запрос

GET /giata_index/giata_type/_search/exists
{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "status": 2
                    }
                },
                {
                    "term": {
                        "ids": "26744"
                    }
                }
            ]
        }
    }
}

с библиотекой ElasticSearch PHP?

Я играл с существующей конечной точкой, но, как выясняется, это может только проверить, существует ли конкретный uid или нет. Поэтому, я думаю, мне нужно сделать поиск. Но я не могу найти параметр в белом списке конечных точек поиска, который позволил бы простую проверку наличия или нет.

Причина, по которой я хотел бы избежать получения всего документа и просто спросить, существует ли он или нет, потому что у меня есть несколько сотен тысяч импорта и столько же документов в ES, поэтому я бы хотел, чтобы он вложил в это немного работы насколько это возможно.

Примечание. Я также рассмотрел запросы главы, которые возможны через HTTP-запросы (только получить заголовок документа - 200 или 404). Но это, вероятно, существует только для запросов через HTTP.

Если худшее ухудшается, я могу застрелить с помощью php и просто сделать это через HTTP. Но я предпочел бы это иначе.

Теги:
elasticsearch

2 ответа

1
Лучший ответ

Кажется, действительно, нет никакой конечной точки для поиска, но я думаю, что вы используете простую альтернативу:

Используйте пустой массив полей. И подсчитайте результаты вашего запроса. Если == 0: false. Если> 0: true

GET /giata_index/giata_type/_search
{
    "fields": [],
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "status": 2
                    }
                },
                {
                    "term": {
                        "ids": "26744"
                    }
                }
            ]
        }
    }
}

Другой вариант - использовать _count: https://www.elastic.co/guide/en/elasticsearch/reference/1.6/search-count.html

  • 0
    Да ... мог бы подумать об этом сам. Я выбрал вариант с массивом пустых полей. Спасибо!
0

Это должно быть возможно с последней версией 2.x. Пример кода может быть примерно таким:

$clientBuilder = Elasticsearch\ClientBuilder::create();
// Additional client options, hosts, etc.
$client = $clientBuilder->build();

$index = 'your_index';
$type = 'your_type';

$params = [
  'index' => $index,
  'type'  => $type,
  'body'  => [
    'query' => [
      'bool' => [
        'must' => [
          [
            'term' => [
              "status" => 2
            ]
          ],
          [
            'term' => [
              'ids' => "26744"
            ]
          ]
        ]
      ]
    ]
  ];

try {
  $client->searchExists($params);
} catch (Exception $e) {
  // Not found. You might want to return FALSE if wrapped in a function.
  // return FALSE;
}
// Found.

Стоит отметить, что если поиск не завернут в блок try/catch, он может нарушить выполнение и выбросить исключение (код состояния 4xx, если не найден). Кроме того, он не может эффективно использоваться в будущем режиме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню