ES中如何实现like模糊查询

简介: ES中如何实现like模糊查询

问题描述:


我们都知道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从入门到放弃"}

72.png

说明:

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


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


说明:

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%'"
}

查询结果:


转为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。

目录
相关文章
|
Web App开发 自然语言处理 API
巧记Elasticsearch常用DSL语法
记知识先记轮廓,关于DSL语法的轮廓,记住以下3句话即可:1.索引、文档和查询。2.Match、Term和Bool。3.还有翻页和聚合
巧记Elasticsearch常用DSL语法
|
Java 开发工具 Maven
springboot项目打包为sdk供其他项目引用
springboot项目打包为sdk供其他项目引用
2525 1
|
12月前
|
存储 缓存 自然语言处理
Elasticsearch 查询性能优化:从 3 秒到 300ms 的 6 个核心参数调优指南
本文分享某电商平台 Elasticsearch 性能调优实战,通过调整分片数、刷新间隔、缓存配置等 6 个核心参数,将商品搜索从 3 秒优化至 300 毫秒,显著提升查询性能与系统吞吐量。内容涵盖性能诊断、参数调优逻辑、实操方案及避坑指南,助力高频查询场景下的 ES 优化。
|
存储 缓存 监控
极致 ElasticSearch 调优,让你的ES 狂飙100倍!
尼恩分享了一篇关于提升Elasticsearch集群的整体性能和稳定性措施的文章。他从硬件、系统、JVM、集群、索引和查询等多个层面对ES的性能优化进行分析,帮助读者提升技术水平。
|
自然语言处理 搜索推荐 关系型数据库
Elasticsearch实现Mysql的Like效果
在Mysql数据库中,模糊搜索通常使用LIKE关键字。然而,随着数据量的不断增加,Mysql在处理模糊搜索时可能面临性能瓶颈。因此,引入Elasticsearch作为搜索引擎,以提高搜索性能和用户体验成为一种合理的选择。
Elasticsearch实现Mysql的Like效果
|
自然语言处理 应用服务中间件 nginx
一文教会你 分词器elasticsearch-analysis-ik 的安装使用【自定义分词库】
这篇文章是关于如何在Elasticsearch中安装和使用ik分词器的详细教程,包括版本匹配、安装步骤、分词测试、自定义词库配置以及创建使用ik分词器的索引的方法。
一文教会你 分词器elasticsearch-analysis-ik 的安装使用【自定义分词库】
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - term、terms查询
766 0
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
1662 0
|
存储 缓存 监控
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
JVM中G1垃圾收集器:原理、过程和参数配置深入解析
|
存储 SQL 运维
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略