现在很多网站也好页面也罢,很多都离不开搜索,本文将会介绍larvael8中如何正确的使用Elasticsearch,但是本文仅仅只是一个基础。
首先我们需要启动本地已经下载好的Elasticsearch,然后在已经下载好的laravel框架中安装对应的composer包
composer require elasticsearch/elasticsearch
composer包下载好之后,框架内就可以调用Elasticsearch。
通常使用该插件,个人建议封装起来。
添加中文分词
我们想添加中文分词的话,通常情况下在建表之初就要对表进行一个分词设置,这个表不是我们数据库中的表,而是我们使用的es中的一种数据表,不加中文分词的话,不去进行建表也是可以直接添加索引的,因为会自动根据index创建一个数据表,但是我们要配置中文分词的话,则需要在es中手动创建一张数据表,但是有一点需要注意,这个建表操作不是每次都需要去执行的,建表操作我们只需要创建一次就好,你能在MySQL中创建好几张名字相同的数据表么?显然不可以,es也是一样。
$params = [
'index' => "aaa",
'body' => [
'mappings' => [
'properties' => [
//之后可以进行搜索的字段
'room-name' => [
'type' => 'text',
"analyzer" => "ik_max_word",
"search_analyzer" => "ik_max_word"
]
]
]
]
];
$this->client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
// 执行 只用执行一次即可
// $this->client->indices()->create($params);
添加索引
在我们添加数据的同时,我们就应该将索引也同步添加进去,不然我们添加完数据并没有添加对应的索引,那么我们就无法通过索引查询到添加的数据。
我们通过ClientBuilder来调用Elasticsearch,create()为创建,setHosts()为我们需要连接的Elasticsearch的ip,通常不该配置的情况下为127.0.0.1:9200,9200为Elasticsearch默认的端口号,但是该端口号可以进行更改,如更改过端口号只需将9200更改为自己修改过后的端口号。
数据每行对应如下:
index:索引名
type:该字段默认为_doc
id:该字段不写也问题不大,因为该id会自动生成,但是为了我们在执行删除数据的时候为我们自己提供便利,通常情况下将该id设为数据id
body:需要为该索引添加的内容
当我们设置完数组之后,只需将调用了ClientBuilder的函数指向index(),再放入定义好的数组即可生成索引。
查询索引
索引生成之后我们就该考虑如何通过索引进行查询。在创建索引时,我们已经将大致结构写入,因此查询索引的时候,我们要通过创建的索引来查询
进入查询所以方法之后,和添加索引一样,我们需要先连接到Elasticsearch,数组内前三行则为我们创建索引时的名称,因为id是可有可无的,所以我们在查询索引的情况下不进行填写也无伤大雅。下面将介绍数组内每个下标名称的含义。
index:索引名
type:固定为_doc
body:创建索引时我们添加进去的数据
‘query:必须
match:必须,此为查询方法,可更改为其他方法
room-name:这个名字是跟随着自己库里的字段名称而改变,也就是想要查询的列做改变
highlight:此数组内的内容为高亮显示
fields:指定要搜索的字段列表
room-name:查询的字段名
per_tags:查询到的内容前需要添加的形式
post_tags:查询到的内容后需要添加的形式
数组定义结束之后,我们就要执行这个数组,将调用了ClientBuilder的函数指向search(),这时我们就会得到一个数组
这个时候我们需要改变这个数组的格式,变成可以为我所用的格式,因此我们需要对该数组进行遍历。
我们针对性的直接指向array()中 hits 内的 hits ,因为我们所需要的数据都保存在其中,不需要其他的多余的数据,最终呈现在我们面前的则是
在遍历之前我们需要先清楚我们为什么要把数组改为我们需要的格式,那么我们需要的格式是什么。如果我们不需求高亮显示的话,我们的查询的数据不需要遍历就已经可以用了,只需调用数据中 hist 下的 hist 下的 _source 即可,但是我们现在所需要的是高亮显示,因此我们需要把添加过高亮样式的数据放入我们所展示的数据当中,也就是放入 _source之中,明白我们需求的情况下,循环遍历数组进行修改就会变得简单明了。
之所以在遍历的时候我们要指向一个下表0,是因为在高亮显示的数据中,只有这一个下标为0的数据,因此直接指向该下标,而在查询的数据当中我们使用$k,是因为我们通过一个索引查到的数据不会只有一条,而是多条,所以我们需要把每条的数据都进行更改。
最后使用 array_column 函数提取数据即可
删除索引
我们删除数据的时候,我们会发现,这条数据我明明已经删除了,但是搜索的时候缺依旧能够把这条数据搜索出来,这是因为我们虽然删除了这条数据,但是我们并没有删除对应的索引,我们在创建数据的同时已经将索引同步创建,因此为一条数据一个索引,我们把该数据删掉了,自然而然要删除该索引。
进入方法还是那个连接Elasticsearch,它还在,它始终没有走,这时候你会发现,我添加的时候,数组有四条数据,查询的时候,那四条数据只出现了三个,少了 id ;删除的时候,有了 id 却少了 body 。这是因为查询用不到 id ,删除用不到 body ,因此没必要多余的去写它。
在添加索引的时候,我说这个 id 是会自动生成的,但是我们最好改为数据对应的id,就是因为我们在删除索引的时候会用到,如果是自动生成的id,我们不好获取到。数组内的数据在这里就不再赘述,跟添加的时候一样。
我们将删除数据时的id传入该方法之中,执行删除,与数据对应的索引就会随之删除。