Maison  >  Article  >  développement back-end  >  Utilisation de base de PHP Elasticsearch

Utilisation de base de PHP Elasticsearch

小云云
小云云original
2018-05-18 10:21:2136692parcourir

Pour l'installation d'Elasticsearch et Elasticsearch-php, il existe de nombreux tutoriels sur Internet, je ne les répéterai donc pas ici. Faites juste attention aux versions d'Elasticsearch, Elasticsearch-php et php. Ici, l'auteur utilise la version Windows d'Elasticsearch 5.6.8, php 5.6, le framework php onethink (ci-après dénommé ot) et Elasticsearch-php composer comme suit : (Tutoriel vidéo PHP Composer)

{  
    "require":{  
        "elasticsearch/elasticsearch" : "~5.0"  
    }  
}

Recommandation de cours → : "Elasticsearch Full Text Search Practical Combat" (Vidéo pratique)

Du cours "Dix Solution de concurrence de données de niveau million (théorie + combat pratique)》

1. Connectez-vous à Elasticsearch :

1. peut y accéder directement via http://127.0.0.1 :9200/View basic information.

2. Copiez les fichiers sous composer seller dans le répertoire ThinkPHPLibraryVendorelasticsearch.

3. Connectez-vous à Elasticsearch,

    public $es;

    /**
     * 初始化
     */
    public function _initialize()
    {
        Vendor('elasticsearch.autoload');
        //host数组可配置多个节点
        $params = array(
            '127.0.0.1:9200'
        );
        $this->es = \Elasticsearch\ClientBuilder::create()->setHosts($params)->build();
    }

La méthode build() convertira l'objet ClientBuilder en objet Client.

2. Utilisation d'Elasticsearch-php :

1. Créer un index :

Concernant l'index et le type, voici une correction spéciale. La base de données et le type dans les bases de données relationnelles sont comme des tables dans une base de données. Cette compréhension est fausse.

    /**
     * 创建索引
     */
    public function createIndex(){
        $params = [
            'index' => 'test', //索引名称
            'body' => [
                'settings'=> [ //配置
                    'number_of_shards'=> 3,//主分片数
                    'number_of_replicas'=> 1 //主分片的副本数
                ],
                'mappings'=> [  //映射
                    '_default_' => [ //默认配置,每个类型缺省的配置使用默认配置
                        '_all'=>[   //  关闭所有字段的检索
                            'enabled' => 'false'
                        ],
                        '_source'=>[   //  存储原始文档
                            'enabled' => 'true'
                        ],
                        'properties'=> [ //配置数据结构与类型
                            'name'=> [ //字段1
                                'type'=>'string',//类型 string、integer、float、double、boolean、date
                                'index'=> 'analyzed',//索引是否精确值  analyzed not_analyzed
                            ],
                            'age'=> [ //字段2
                                'type'=>'integer',
                            ],
                            'sex'=> [ //字段3
                                'type'=>'string',
                                'index'=> 'not_analyzed', 
                            ],
                        ]
                    ],
                    'my_type' => [ 
                        'properties' => [
                            'phone'=> [ 
                                'type'=>'string',
                            ],                            
                        ]
                    ],
                ],
            ]
        ];

        $res = $this->es->indices()->create($params);
    }

Lors de l'utilisation de l'API Elasticsearch-php, le paramètre $params est généralement un tableau, car la structure du tableau peut être facilement convertie en json. Parmi eux,

_default_ est la configuration par défaut, et les valeurs par défaut des autres configurations sont les mêmes que _default_.

_all défini sur true regroupera tous les documents originaux pour un stockage supplémentaire.

_source défini sur true stockera les documents originaux. Le paramètre false est généralement utilisé lorsque seul le titre ou l'URL du document. doit être indexé Scénarios dans lesquels les documents sont accessibles via l'URL sans enregistrer une copie du contenu du document dans es.

Enfin, notez que le type de données et la configuration des champs portant le même nom dans différents types sous le même index doivent également être les mêmes  !

2. Supprimer l'index :

    /**
     * 删除索引
     */
     public function deleteIndex(){
        $params = [
            'index' => 'test'
        ];

        $res = $this->es->indices()->delete($params);
     }

3. Afficher les mappages :

    public function getMappings(){
        $params = [
            'index' => 'test'
        ];

        $res = $this->es->indices()->getMapping($params);
    }

4. Modifier les mappages :

    public function putMappings(){
        $params = [           
            'index' => 'test',
            'type' => 'my_type',
            'body' => [
                'my_type' => [
                    'properties' => [
                        'idcard' => [
                            'type' => 'integer'
                        ]
                    ]
                ]
            ]
        ]; 

        $res = $this->es->indices()->putMapping($params);      
    }

Remarque : L'API de modification des mappages doit spécifier le type et peut uniquement ajouter et ne peut pas modifier les attributs existants.

5. Insérez un seul document :

    public function postSinDoc(){
        $params = [
            'index' => 'test',
            'type' => 'my_type',
            'body' => [ 
                'age' => 17,
                'name' => 'saki',
                'sex' => '女性',
                'idcard' => 1112,
                'phone' => '1245789',
            ]
        ];

        $res = $this->es->index($params);
    }

6. Insérez plusieurs documents :

    public function postBulkDoc(){
        for($i = 0; $i < 5; $i++) {
            $params[&#39;body&#39;][] = [
                &#39;index&#39; => [
                    &#39;_index&#39; => &#39;test&#39;,
                    &#39;_type&#39; => &#39;my_type&#39;,
                ]
            ];

            $params[&#39;body&#39;][] = [
                &#39;age&#39; => 17+$i,
                &#39;name&#39; => &#39;reimu&#39;.$i,
                &#39;sex&#39; => &#39;女性&#39;,
                &#39;idcard&#39; => 1112+$i,
                &#39;phone&#39; => &#39;1245789&#39;.$i,
            ];
        }

        $res = $this->es->bulk($params);
    }

7. Obtenez le document par identifiant :

    public function getDocById(){
        $params = [
            &#39;index&#39; => &#39;test&#39;,
            &#39;type&#39; => &#39;my_type&#39;,
            &#39;id&#39; => &#39;AWIDV5l2A907wJBVKu6k&#39;
        ];

        $res = $this->es->get($params);
    }
8. Mettre à jour le document par identifiant :

    public function updateDocById(){
        $params = [
            &#39;index&#39; => &#39;test&#39;,
            &#39;type&#39; => &#39;my_type&#39;,
            &#39;id&#39; => &#39;AWIDV5l2A907wJBVKu6k&#39;,
            &#39;body&#39; => [
                &#39;doc&#39; => [ //将doc中的文档与现有文档合并
                    &#39;name&#39; => &#39;marisa&#39;
                ]
            ]
        ];

        $res = $this->es->update($params);
    }
9. Supprimer le document par identifiant :

    public function deleteDocById(){
        $params = [
            &#39;index&#39; => &#39;test&#39;,
            &#39;type&#39; => &#39;my_type&#39;,
            &#39;id&#39; => &#39;AWIDV5l2A907wJBVKu6k&#39;
        ];

        $res = $this->es->delete($params);
    }
Remarque : les trois opérations ci-dessus par identifiant, si l'identifiant n'est pas le cas. trouvé, Elasticsearch-php signalera directement une erreur !

10. Document de recherche :

    public function searchDoc(){
        $params = [
            &#39;index&#39; => &#39;test&#39;,
            &#39;type&#39; => &#39;my_type&#39;,
            &#39;body&#39; => [
                &#39;query&#39; => [
                    &#39;constant_score&#39; => [ //非评分模式执行
                        &#39;filter&#39; => [ //过滤器,不会计算相关度,速度快
                            &#39;term&#39; => [ //精确查找,不支持多个条件
                                &#39;name&#39; => &#39;reimu0&#39;
                            ]
                        ]
                        
                    ]
                ]
            ]
        ];

        $res = $this->es->search($params);
Ceci est juste un exemple de recherche.

Recommandations associées :

Explication détaillée du problème d'asymétrie des données entre MySQL et Elasticsearch

Qu'est-ce qu'Elasticsearch ? Où peut-on utiliser Elasticsearch ?

Tutoriel d'exemple d'indexation et d'opération de document Elasticsearch

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn