前言:
ElasticSearch 是一个一个分布式的实时文档存储,每一个字段都能够被索引与搜寻,并且能反对 PB 级别的结构化或者非结构化数据。晚期咱们利用的全局搜寻是简略的 SQL 含糊查问,为了分担数据库压力所以用了 ES,抉择他的起因除了以上几点外,还有其提供的 API 形式简略,于任何对接的编程语言都实用。以下将以 PHP 的业务场景欠缺搜寻性能。
环境:
- ThinkPHP5.1
- ElasticSearch7.8
- PHP7.3
性能迭代简介:
最开始的 ES 取代办法解决了搜寻速度问题,起初新增的 ik 分词器,解决了搜寻词条繁多问题。单也正是中文分词起因,对每句话都是拆解成指定粒度的词。当遇到单词时,个别只会对一句话里的单词进行拆解,而搜寻时须要输出某个字母,心愿输入的是带字母前面的词条,也就是含糊查问。通过翻阅文档,发现了即时搜寻。
即时搜寻或输出即搜寻(search-as-you-type),就是当用户习惯在输完查问内容之前,就能为他们展示搜寻后果,不仅能在更短的工夫内失去搜寻后果,也能疏导用户搜寻索引中实在存在的后果。例如,输出 dvd r,即时搜寻会失去:dvd r9s 和 dvd r9sk 等 , 以下将通过残缺示例演示成果。
配置索引的映射:
对于 ElasticSearch 环境搭建和基本操作在后面文章有阐明,这里就伪装曾经创立了索引,以下是索引的映射。还有文档的增加也是依据你本人的需要定义了,不论是定时工作还是业务节点触发,亦或是采集工具同步等。
{
"mappings": {
"_doc": {
"properties": {
"class_id": {"type": "long"},
"goods_name": {
"type": "text",
"analyzer": "ik_smart"
},
"goods_sort": {"type": "keyword"},
"id": {"type": "keyword"},
"price": {"type": "long"},
"single_goods_name": {
"type": "text",
"analyzer": "ik_max_word"
},
"state": {"type": "keyword"},
"v": {"type": "long"}
}
}
}
}
前台搜寻:
1. 即搜寻示例
{
"match_phrase_prefix" : {
"brand" : {
"query": "walker johnnie bl",
"slop": 10
}
}
}
2. 业务代码
public function queryData($key, $sort, $from = 0, $size = 10)
{
$from = $from * $size;
$indexName = Env::get('elasticsearch.goods_index') ?? 'products';
$params = [
'index' => $indexName,
'client' => [
'timeout' => 10,
'connect_timeout' => 10
],
'body' => [
'from' => $from,
'size' => $size,
'query' => [
'bool' => [
'should' => [
[
'multi_match' => [
'query' => $key,
'fields' => [
'goods_name^2',
'single_goods_name'
],
],
],
[
'wildcard' => ['single_goods_name' => "$key*"]
],
[
'fuzzy' => [
'single_goods_name' => ['value' => $key]
]
],
[
'match_phrase_prefix' => ['single_goods_name' => "$key"]
],
],
],
],
'sort' => [['_score' => "desc"],
['goods_sort' => 'desc']
],
]
];
return $this->es->search($params);
}