前言:

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);}

3. 成果演示