首页 > 其他分享 >ElasticSearch中文分词和模糊查询

ElasticSearch中文分词和模糊查询

时间:2023-05-08 20:58:35浏览次数:29  
标签:中文 goods name single 搜索 key ElasticSearch type 分词

前言:

        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. 效果演示

标签:中文,goods,name,single,搜索,key,ElasticSearch,type,分词
From: https://www.cnblogs.com/zerofc/p/17383068.html

相关文章

  • 在网络编程中涉及中文的编码解码的问题
    在网络编程中涉及中文需要编码解码的场景编码URLEncoder.encode("我最爱桃子了","utf-8")解码URLdecoder.decode("我最爱桃子了","utf-8");......
  • 【论文解读】(拼音+字形+字三种信息的中文BERT)ChineseBERT: Chinese Pretraining Enhan
    文章目录1.相关信息2.论文内容3.论文模型3.1GlyphEmbedding3.2PinyinEmbedding4.实验与结论5.模型使用方式1.相关信息论文年份:2021论文地址:https://aclanthology.org/2021.acl-long.161.pdf论文代码(官方):https://github.com/ShannonAI/ChineseBertHuggingFace:Shan......
  • C# .net core 返回json 中文字符编码被转换或乱码问题
    开发环境VS2022+.NET6.0现象接口返回Json中文数据时出现乱码。例如后台返回结果:"0506133015\u56FE\u8868\u9009\u62E9.png"。解决办法以下方法任选其一即可。//方法1:在Program.cs中添加以下代码varbuilder=WebApplication.CreateBuilder(args);builder.Services.Ad......
  • elasticsearch7.x 插件安装异常
     (本博客近期所有es文章都是基于elasticsearch7.1.0),请选择Plugin[analysis-pinyin]wasbuiltforElasticsearchversion7.1.1butversin明显是版本号不一致,解决:进入vimelasticsearch-7.1.0/plugins/pinyin/plugin-descriptor.properties修改为elasticsearch对应版本,重新启动E......
  • Springboot2.x整合ElasticSearch7.x实战(三)
    大概阅读10分钟本教程是系列教程,对于初学者可以对ES有一个整体认识和实践实战。还没开始的同学,建议先读一下系列攻略目录:Springboot2.x整合ElasticSearch7.x实战目录本篇幅是继上一篇Springboot2.x整合ElasticSearch7.x实战(二),适合初学Elasticsearch的小白,可以跟着整个教程做......
  • 【ElasticSearch面试】10道不得不会的ElasticSearch面试题
    以下是ElasticSearch面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。评论区见关于es的面试,建议使用名词用官方语言描述会更准确。@[toc]1.说说你们公司es的集群架构,索......
  • 录屏界鼻祖Camtasia 2023中文版功能介绍/下载安装激活教程
    随着网络科技的迅速发展,所以对于电脑的使用率也就越来越高了!然而,也可能跟这有关系,目前各种类型的软件层出不穷,当然也就包括了电脑录屏软件。这给我们造成了一些困难,究竟哪一款适合自己呢?Camtasia2023是TechSmith公司出品的一款屏幕录像和编辑的软件,可轻松录制和分享高质量的截屏视......
  • 使用 @ResponseBody 注解直接返回json字符串结果中文出现乱码
    在类上直接使用@RestController,这样子,里面所有的方法都只会返回json字符串了,不用再每一个都添加@ResponseBody!我们在前后端分离开发中,一般都使用@RestController,十分便捷!@RestControllerpublicclassUserController{//produces:指定响应体返回类型和编码@Request......
  • 再谈elasticsearch下的深度分页
    Elasticsearch在业务系统中使用也越来越广,一些开发规范也需要慢慢重视起来。我们知道在关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,在es中也应该尽量避免使用深度分页。es提供的分页查询是通过from和size参数来完成,from默认是0,size默认为10,比如:{"from":100000,......
  • post提交中文数据出现乱码问题
    POST发送参数发送请求与参数:接收参数:和GET一致,不用做任何修改@ControllerpublicclassUserController{​  @RequestMapping("/commonParam")  @ResponseBody  publicStringcommonParam(Stringname,intage){    System.out.println("普通参数传递......