当前位置: 首页 > news >正文

ES字符串从任意位置模糊查询(支持只匹配含连续字符串内容)

巨人的肩膀

ElasticSearch一看就懂之分词器edge_ngram和ngram的区别

需求

某个ES index中text 类型的name 字段 (内容只为英文),支持字符串 从任意位置 的以下模糊搜索能力:

1、单字母模糊查询
已有数据:“zhang san”、“li si”、“wang wu”
例如: 输入 n
返回:返回 “zhang san”、 “wang wu”

2、字符串模糊查询:查询条件为连续的字符串时,只返回含有该连续字符串的内容
已有数据:“zhang san”、“li si”、“wang wu”
例如: 输入 hang
返回:返回 “zhang san”(而不会返回 “wang wu”)

3、查询条件有空格,则应视为两个查询条件做模糊查询
已有数据:“zhang san”、“li si”、“wang wu”
例如: 输入 “hang si”
返回:返回 “zhang san”、“li si”

实现

ES index定义 【核心】

PUT user-info
{
  "mappings": {
    "properties": {
      "id": {"type": "keyword"},
      "name": {
        "type": "text",
        "analyzer": "name_analyzer",
        // 查询条件按空格分词,以实现需求3
        "search_analyzer": "whitespace"
      }
    }
  },
  "settings": {
  // 此值应>= 下面的ngram_filter中的max_gram减min_gram的值
    "max_ngram_diff": 50,
    "analysis": {
      "filter": {
        "ngram_filter": {
          "type": "ngram",
          // 任意位置分词,步长最短为1,最长为50,最长值视具体需求而定,可自行修改(需考虑ES存储成本)
          // 详情见参考文章[ElasticSearch一看就懂之分词器edge_ngram和ngram的区别]
          "min_gram": "1",
          "max_gram": "50"
        }
      },
      "analyzer": {
        "name_analyzer": {
          "filter": [
            "asciifolding",
            "lowercase",
            // 从任意位置开始分词,这是实现模糊查询的关键
            "ngram_filter"
          ],
          // 原始数据按空格分词
          "tokenizer": "whitespace"
        }
      }
    }
  }
}

预备数据

POST user-info/_doc/1
{
  "id": 1,
  "name": "zhang san"
}
POST user-info/_doc/2
{
  "id": 2,
  "name": "li si"
}
POST user-info/_doc/3
{
  "id": 3,
  "name": "wang wu"
}


确认预备数据:
GET user-info/_search
...
"hits" : [
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : 1,
          "name" : "zhang san"
        }
      },
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "id" : 2,
          "name" : "li si"
        }
      },
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "id" : 3,
          "name" : "wang wu"
        }
      }
    ]
...

验证

需求1

单字母模糊查询

GET user-info/_search
{
  "query": {
    "match": {
      "name": "n"
    }
  }
}

查询结果:
...
"hits" : [
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.84928787,
        "_source" : {
          "id" : 1,
          "name" : "zhang san"
        }
      },
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.72056305,
        "_source" : {
          "id" : 3,
          "name" : "wang wu"
        }
      }
    ]
...
需求2

字符串模糊查询:查询条件为连续的字符串时,只返回含有该连续字符串的内容

GET user-info/_search
{
  "query": {
    "match": {
      "name": "hang"
    }
  }
}

查询结果:
...
"hits" : [
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.5037103,
        "_source" : {
          "id" : 1,
          "name" : "zhang san"
        }
      }
    ]
...
需求3

查询条件有空格,则应视为两个查询条件做模糊查询

GET user-info/_search
{
  "query": {
    "match": {
      "name": "hang si"
    }
  }
}

查询结果:
...
"hits" : [
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.5037103,
        "_source" : {
          "id" : 1,
          "name" : "zhang san"
        }
      },
      {
        "_index" : "user-info",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.5037103,
        "_source" : {
          "id" : 2,
          "name" : "li si"
        }
      }
    ]
...

相关文章:

  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • STM32F103移植FreeRTOS必须搞明白的系列知识---4(FreeRTOSConfig.h配置文件)
  • Java基础2(二维数组、数组的赋值判定)
  • Redis 强化之一
  • 打印设备电磁泄露信息提取和还原技术的matlab仿真实现
  • 【C++】类和对象(中)—— 日期类的实现 | const成员函数
  • 树莓派视频监控项目总结
  • datax与多种数据库间数据类型映射
  • Redis哨兵模式与Redis缓存穿透、击穿和雪崩
  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法
  • 4K Star , Github上照片转漫画最强项目
  • Matlab 创建YOLO v2目标检测网络(仅仅是网络)
  • Java集合04:Collection子接口二:Set接口
  • 查看CPU核数、内存使用情况【一文读懂】
  • 【 java 多线程】死锁的问题
  • 【347天】每日项目总结系列085(2018.01.18)
  • angular组件开发
  • css选择器
  • Javascript Math对象和Date对象常用方法详解
  • Java读取Properties文件的六种方法
  • Java方法详解
  • nodejs调试方法
  • PhantomJS 安装
  • Python_OOP
  • Redux系列x:源码分析
  • spring学习第二天
  • Swift 中的尾递归和蹦床
  • uni-app项目数字滚动
  • v-if和v-for连用出现的问题
  • vuex 学习笔记 01
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 排序算法学习笔记
  • 微信小程序:实现悬浮返回和分享按钮
  • 详解移动APP与web APP的区别
  • No resource identifier found for attribute,RxJava之zip操作符
  • 【云吞铺子】性能抖动剖析(二)
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​插件化DPI在商用WIFI中的价值
  • #13 yum、编译安装与sed命令的使用
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Matlab)使用竞争神经网络实现数据聚类
  • (ros//EnvironmentVariables)ros环境变量
  • (笔试题)分解质因式
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (算法二)滑动窗口
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .gitignore文件—git忽略文件
  • .Net多线程总结
  • .net中的Queue和Stack
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录