lca/elasticsearch

此软件包已被弃用,不再维护。未建议替代软件包。
关于此软件包最新版本(dev-master)的许可信息不可用。

PHP Elasticsearch项目开发实践

安装: 2

依赖: 0

建议: 0

安全: 0

星级: 1

关注者: 0

分支: 0

开放问题: 0

语言:TSQL

类型:项目

dev-master 2019-07-02 08:28 UTC

This package is not auto-updated.

Last update: 2020-01-29 10:14:22 UTC


README

在PHP中使用Elasticsearch

基于elasticsearch全文搜索引擎的PHP开发 1.概述:全文搜索是常见需求,开源的Elasticsearch(以下简称Elastic)是目前全文搜索引擎的首选。Elastic的底层是开源库Lucene。但是,你不能直接使用Lucene,必须编写代码来调用其接口。Elastic是Lucene的封装,提供了REST API操作接口,开箱即用。Elasticsearch中涉及的重要概念

1)Cluster:集群。ES可以作为独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在多个互相协作的服务器上。这些服务器的集合称为集群。

2)Node:节点。形成集群的每个服务器称为节点。

3)Shard:分片。当有大量文档时,由于内存限制、磁盘处理能力不足、无法快速响应用户请求等原因,单个节点可能不足以处理。这种情况下,数据可以分为较小的分片,每个分片放在不同的服务器上。当你查询的索引分布在多个分片上时,ES会将查询发送到每个相关的分片,并将结果组合在一起,应用程序不知道分片的存在。即:这个过程对用户来说是透明的。

4)Replica:副本。为了提高查询吞吐量或实现高可用性,可以使用分片副本。副本是分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选为主分片以更改索引操作。当主分片丢失时,如:该分片所在的数据不可用,集群将副本提升为新的主分片。

5)全文检索。全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于MySQL中的LIKE语句。全文索引就是根据词的意义进行分词,然后分别创建索引,例如“你们的激情是因为什么事情来的”可能被分词成:“你们”,“激情”,“什么事情”,“来”等token,这样当你搜索“你们”或“激情”时都会搜出这句。

好了,本文主要讲解Elasticsearch环境搭建及中文分词用法。下面讲解Elasticsearch环境搭建及使用。

2.环境搭建 1.安装JAVA JDK 8

sudo apt-get update sudo apt-get install openjdk-8-jre 查看jdk安装信息:

2.下载最新的elasticsearch安装包: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.2.tar.gz tar -zxvf elasticsearch-6.6.2.tar.gz cd elasticsearch-6.6.2 启动 ./bin/elasticsearch 启动会打印启动的包信息:

  1. 安装IK中文分词插件。在ik分词的git(https://github.com/medcl/elasticsearch-analysis-ik )上找到相应的ES对应的版本:

我这里安装的是最新的版本6.6.2:

看到上面的信息,那么我们的环境就搭建好了。

3.使用。我在本地建立了一张书本信息表,其中有4个字段,其中attr_text字段存储英文,其他字段存储中文

接下来创建索引:

先设置索引参数:

$params = [

    'index' => 'douban',

    'body' => [

        'settings' => [

            'number_of_shards' => 3,

            'number_of_replicas' => 2,

            'analysis' => [

               'filter' => [

                "ngram_filter" => [

                   "type" => "ngram",

                   "min_gram" => 2,

                   "max_gram" => 20

                   ]

                ],

                'analyzer' => [

                    "ngram_analyzer" => [

                        "type" => "custom",

                        "tokenizer" => "whitespace",

                        "filter" => [

                            "lowercase",

                            "asciifolding",

                           "ngram_filter"

                        ]

                   ]

                ]

            ]

        ],

        'mappings' => [

            'dd_book' => [

                '_source' => [

                    'enabled' => true

                ],

                'properties' => [

                    'book_name' => [

                              'type' => 'text',

                              'analyzer' => 'ik_max_word',

                              'search_analyzer' => 'ik_max_word',

                     ],

                    'book_author' => [

                              'type' => 'text',

                              'analyzer' => 'ik_max_word',

                              'search_analyzer' => 'ik_max_word',

                    ],

                    'book_desc' => [

                              'type' => 'text',

                              'analyzer' => 'ik_max_word',

                              'search_analyzer' => 'ik_max_word',

                    ],

                    'attr_text' => [

                              'type' => 'text',

                        'analyzer' => 'ngram_analyzer',

                        'search_analyzer' => 'standard',

                    ],

                  

                ]

            ]

        ]

    ]

];

 

其中book_name,book_author,book_desc都使用中文,并且使用了IK中文分词器。attr_text是英文的,因此使用了ngram分词器(Elasticsearch自带的分词器)

接下来,我们创建索引:

php createDoubanIndex.php

看到已经创建完成

紧接着,我们将MySQL的书本信息表数据生成索引数据:

php insertDataToEs.php

好了,以上准备工作已经完成