首页 > 其他分享 >ES中如何实现like模糊查询

ES中如何实现like模糊查询

时间:2022-12-07 20:07:29浏览次数:75  
标签:index like 通配符 查询 content wildcard ES


问题描述:

我们都知道ES针对复杂的多添加组合查询非常强大,也知道通过match可以实现全文检索查询(分词查询),但是如果现在我只需要实现类似mysql中的like全匹配模糊查询,该怎么实现呢?


业务场景:

从content_index表中查询字段content中包含ES的记录。
在关系型数据库中对应的SQL语句:

SELECT 
content
FROM content_index
WHERE content like '%ES%'

数据准备:

## 删除索引
## DELETE content_index
## 新建索引
PUT content_index
{
"mappings": {
"properties": {
"content": {
"type": "wildcard"
}
}
}
}
## 添加数据
POST content_index/_bulk?refresh
{ "create": { } }
{ "content": "老万最近正在学习ES"}
{ "create": { } }
{ "content": "老万精通JAVA"}
{ "create": { } }
{ "content": "ES从入门到放弃"}

说明:
ElasticSearch 5.0以后,String字段被拆分成两种新的数据类型: text用于全文搜索,会分词,而keyword用于关键词搜索,不进行分词。

补充:​​官网对wildcard字段类型的说明​

ES中如何实现like模糊查询_字段


说明:

1、采用wildcard通配符查询的字段推荐采用字段type设置为wildcard。

2、text字段会进行分词,wildcard通配符查询检索的是分词后的数据。

3、keyword字段虽然不会进行分词,但执行通配符wildcard查询(特别是带有前导通配符的模式)很慢。

实现方案:

1、sql实现

POST /_sql?format=txt
{
"query": "SELECT content FROM content_index Where content like '%ES%'"
}

查询结果:

ES中如何实现like模糊查询_wildcard_02


转为DSL查看底层实现:

POST /_sql/translate
{
"query": "SELECT content FROM content_index Where content like '%ES%'"
}

执行结果:
底层就是基于wildcard的通配符查询,其中?和*分别代替一个和多个字符。

{
"size" : 1000,
"query" : {
"wildcard" : {
"content" : {
"wildcard" : "*ES*",
"boost" : 1.0
}
}
},
"_source" : false,
"stored_fields" : "_none_",
"docvalue_fields" : [
{
"field" : "content"
}
],
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}

2、dsl实现

利用wildcard通配符查询实现,其中?和*分别代替一个和多个字符。

GET content_index/_search
{
"query": {
"wildcard": {
"content": {
"value": "*ES*"
}
}
}
}

查询结果:

{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "content_index",
"_type" : "_doc",
"_id" : "E3E0BnsBxW9JEct2L-d4",
"_score" : 1.0,
"_source" : {
"content" : "老万最近正在学习ES"
}
},
{
"_index" : "content_index",
"_type" : "_doc",
"_id" : "FXE0BnsBxW9JEct2L-d4",
"_score" : 1.0,
"_source" : {
"content" : "ES从入门到放弃"
}
}
]
}
}

总结

本文主要介绍了ES中通过wildcard通配符查询实现like模糊查询。
而sql查询的方式显然适合大众口味。
使用wildcard通配符查询的目标字段的type类型需要设置为wildcard。


标签:index,like,通配符,查询,content,wildcard,ES
From: https://blog.51cto.com/u_15905482/5919985

相关文章

  • SpringBoot整合elasticsearch-rest-client实战
    前言很多人在Springboot项目中都已经习惯采用Spring家族封装的spring-data-elasticsearch来操作elasticsearch,而官方更推荐采用rest-client。今天给大家介绍下在springbo......
  • 你的ES还在裸奔吗?还不赶紧开启X-Pack权限认证
    前言在es的早期版本中,没有免费提供安全认证的相关功能。为了防止数据安全问题,一般的措施都是采用IP黑白名单,网络防火墙,Nginx代理权限控制。而从es6.8和7.1版本开始,es给我......
  • 还不会ES?Elasticsearch快速入门实操指南送上
    前言本文主要介绍ES的常用请求,让大家能快速上手ES的使用主要参考官网的​​Quickstart​​指引。一、请求方式向Elasticsearch发送请求主要有2种方式:1、使用restapi发送h......
  • python-requests接入API
    API接入1APIApplicationProgrammingInterface,应用程序编程接口,是软件之间信息交互的桥梁。  2聚合数据(数据获取网站)网址:https://www.juhe.cn/docs/index/o......
  • CT data processing (2) data annotation and verification
    InCTimageprocessing,thesegmentationmodelusuallyservesasthefoundationpartforawiderangeofapplications.Totrainasegmentationmodel,anessent......
  • CodeStar2022年春第十一周周赛普及奠基组
    T1:牛奶供应本题难度简单,主要考察贪心算法。第\(i\)天的牛奶成本价为\(\min(c_i,minp+s)\),其中\(minp\)为前\(i-1\)天中牛奶的最低成本价代码实现#include<bit......
  • Response_验证码_分析以及代码实现
    Response_验证码_分析以及代码实现本质:图片目的:防止恶意表单注册步骤:1.创建对象,在内存中图片(验证码图片对象)2.美化图片3.将图片输出到页面展示package......
  • resnet详细解读
    原文链接:https://arxiv.org/abs/1512.03385摘要作者提出了一个残差学习结构用来解决非常深网络的退化问题和训练问题。原来的网络是为了拟合一个分布函数,我们重构了网络......
  • session,cookie,token详解
    session,cookie,token详解1.session1.1session的作用是什么session的作用是用于保存每个用户的专用信息;当用户访问时,服务器都会为每个用户分配唯一的SessionID,而且当......
  • IP地址查询精确到街道
    我们知道ip地址查询精确的位置方法有很多,QQ能够查询到ip地址,对于的用户的位置,但是有时候因为运营商等原因导致查询非移动网络3G/4G的IP地址;这是因为移动3G/4G网络下所使用的......