elastic / elasticsearch-php

Official PHP client for Elasticsearch.
https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html
MIT License
5.25k stars 963 forks source link

使用PHP GET方法,不能获取到文档内容 #1402

Closed wangyongdong closed 1 month ago

wangyongdong commented 1 month ago

Using the PHP GET method, you cannot get the content of the documentation

Code, return information, configuration file

1、Create an index document

use Elastic\Elasticsearch\ClientBuilder;
$config = App::get("config")->get('elasticsearch');
$client = ClientBuilder::create()
    ->setHosts([$config['host']])
    ->setBasicAuthentication($config['user'], $config['pass'])
    ->setSSLVerification(false)
    ->build(); // 如果使用自签名证书,则禁用验证
$params = [
    'index' => 'my_index',
    'id'    => 'my_id',
    'body'  => [ 'testField' => 'abc']
];
$response = $client->index($params);
print_r($response);

Return result:

Elastic\Elasticsearch\Response\Elasticsearch Object
(
    [response:protected] => GuzzleHttp\Psr7\Response Object
        (
            [reasonPhrase:GuzzleHttp\Psr7\Response:private] => Created
            [statusCode:GuzzleHttp\Psr7\Response:private] => 201
            [headers:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [Location] => Array
                        (
                            [0] => /my_index/_doc/my_id
                        )
                    [X-elastic-product] => Array
                        (
                            [0] => Elasticsearch
                        )
                    [content-type] => Array
                        (
                            [0] => application/vnd.elasticsearch+json;compatible-with=8
                        )
                    [content-length] => Array
                        (
                            [0] => 147
                        )
                )
            [headerNames:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [location] => Location
                    [x-elastic-product] => X-elastic-product
                    [content-type] => content-type
                    [content-length] => content-length
                )
            [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
            [stream:GuzzleHttp\Psr7\Response:private] => GuzzleHttp\Psr7\Stream Object
                (
                    [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #171
                    [size:GuzzleHttp\Psr7\Stream:private] =>
                    [seekable:GuzzleHttp\Psr7\Stream:private] => 1
                    [readable:GuzzleHttp\Psr7\Stream:private] => 1
                    [writable:GuzzleHttp\Psr7\Stream:private] => 1
                    [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
                    [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                        (
                        )
                )
        )
)

2、Get the document:

use Elastic\Elasticsearch\ClientBuilder;
$config = App::get("config")->get('elasticsearch');
$client = ClientBuilder::create()
    ->setHosts([$config['host']])
    ->setBasicAuthentication($config['user'], $config['pass'])
    ->setSSLVerification(false)
    ->build();
$params = [
    'index' => 'my_index',
    'id'    => 'my_id',
];
$response = $client->get($params);
print_r($response);

Return result:

Elastic\Elasticsearch\Response\Elasticsearch Object
(
    [response:protected] => GuzzleHttp\Psr7\Response Object
        (
            [reasonPhrase:GuzzleHttp\Psr7\Response:private] => OK
            [statusCode:GuzzleHttp\Psr7\Response:private] => 200
            [headers:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [X-elastic-product] => Array
                        (
                            [0] => Elasticsearch
                        )
                    [content-type] => Array
                        (
                            [0] => application/vnd.elasticsearch+json;compatible-with=8
                        )
                    [content-length] => Array
                        (
                            [0] => 123
                        )
                )
            [headerNames:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [x-elastic-product] => X-elastic-product
                    [content-type] => content-type
                    [content-length] => content-length
                )
            [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
            [stream:GuzzleHttp\Psr7\Response:private] => GuzzleHttp\Psr7\Stream Object
                (
                    [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #169
                    [size:GuzzleHttp\Psr7\Stream:private] =>
                    [seekable:GuzzleHttp\Psr7\Stream:private] => 1
                    [readable:GuzzleHttp\Psr7\Stream:private] => 1
                    [writable:GuzzleHttp\Psr7\Stream:private] => 1
                    [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
                    [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                        (
                        )
                )
        )
)

I can't see the content of the document in the return result. Use the CURL -X GET" http://192.168.xxx.xxx:9200/my_index/_doc/my_id?pretty ", the return results are as follows as follows:

{
  "_index" : "my_index",
  "_id" : "my_id",
  "_version" : 4,
  "_seq_no" : 106,
  "_primary_term" : 2,
  "found" : true,
  "_source" : {
    "testField" : "abc"
  }
}

Why can you create documents through PHP and cannot get the content of the document?

/etc/elasticsearch/elasticsearch.yml The content of the file is as follows:

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: Medlive_Es
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /var/lib/elasticsearch
#
# Path to log files:
#
path.logs: /var/log/elasticsearch
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
network.host: 0.0.0.0
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:
#
http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["0.0.0.0"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["node-1"]
#
# For more information, consult the discovery and cluster formation module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Allow wildcard deletion of indices:
#
#action.destructive_requires_name: true

#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically      
# generated to configure Elasticsearch security features on 13-05-2024 08:33:09
#
# --------------------------------------------------------------------------------

# Enable security features
xpack.security.enabled: false

xpack.security.enrollment.enabled: true

# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
  enabled: false
  keystore.path: certs/http.p12

# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
  enabled: false
  verification_mode: certificate
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later

# Allow HTTP API connections from anywhere
# Connections are encrypted and require user authentication
http.host: 0.0.0.0

# Allow other nodes to join the cluster from anywhere
# Connections are encrypted and mutually authenticated
#transport.host: 0.0.0.0

#----------------------- END SECURITY AUTO CONFIGURATION -------------------------

http.cors.enabled: true
http.cors.allow-origin: "*"

System details

ezimuel commented 1 month ago

I'm sorry but we can provide support only in English. Can you translate your request? Thanks!

wangyongdong commented 1 month ago

I'm sorry but we can provide support only in English. Can you translate your request? Thanks!

Sorry, I have translated it into English

ezimuel commented 1 month ago

@wangyongdong the $response is an object of Elastic\Elasticsearch\Response\Elasticsearch that is compatible with PSR-7 regarding the HTTP response and it offers also the body content.

Here you can find more information about the response object.

The body content is stored inside the same object and you can take it as object property or using an array index interface. For instance, to get a document you can use the following code:

$params = [
    'index' => 'my_index',
    'id'    => 'my_id',
];
$response = $client->get($params);

var_dump($response['_source']); // get the document using array interface
var_dump($response->_source); // get the document as object property
wangyongdong commented 1 month ago

@wangyongdong the $response is an object of Elastic\Elasticsearch\Response\Elasticsearch that is compatible with PSR-7 regarding the HTTP response and it offers also the body content.

Here you can find more information about the response object.

The body content is stored inside the same object and you can take it as object property or using an array index interface. For instance, to get a document you can use the following code:

$params = [
    'index' => 'my_index',
    'id'    => 'my_id',
];
$response = $client->get($params);

var_dump($response['_source']); // get the document using array interface
var_dump($response->_source); // get the document as object property

Thank you