一、 问题描述

  1. 需要搜索的内容为:【飞科剃须刀】
  2. 实际搜索,需要满足的条件:
    a.检索关键词“飞科”,“剃须”、“刀”,都能搜出这篇文档。
    b.干扰搜索“水果刀”,文档不要被检索出来。
    c.单个字拆分“剃”、“须”太多干扰文档不要被检索出来。
    d.待检索的词“科剃”、“科剃须”不在词典中,但只要在原文中出现,都要检索到。
    e.检索关键词“飞科剃须”,能搜出这篇文档
    f.检索速度要快,不影响性能。
  3. 分词测试:
  • Standard分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"standard"
}
分词结果:飞、科、剃、须、刀
  • ik_max_word分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"ik_max_word"
}
分词结果:飞、科、剃须刀、剃须、刀
  • ik_smart分词器
GET /my_index/_analyze
{"text":"飞科剃须刀","analyzer":"ik_smart"
}
分词结果:飞、科、剃须刀

二、问题分析

  1. 针对要求a,可以采用全文检索(match、match_phrase)。
  • match查询实现精确匹配
GET /my_index/_search
{"query":{"match":{"qss":{"query":"飞科"  //分别尝试“剃须”、“刀”,都能检索到包含“飞科剃须刀”的文档}}}
}
  • match_phrase查询实现完全匹配
    文档同时满足下面两个条件才会被搜索到:
    (1)分词后所有词项都要出现在该字段中
    (2)字段中的词项顺序要一致
GET my_index/_search
{"query": {"match_phrase": {"qss": "飞科" //分别尝试“剃须”、“刀”,都能检索到包含“飞科剃须刀”的文档}}
}
  1. 针对要求b,match查询检索范围太大、干扰太多,排除;ik_smart分词器没有“剃须”词项,排除match查询后,与 match_phrase 结合使用,依然检索不到,故排除。
  2. 针对要求c,standard 分词器会出现非常多冗余数据,排除。
  3. 针对要求d,ik_max_word 有些词项不包含,排除。
  4. 针对要求e,match_phrase 查询不到,排除。
  5. 针对要求f,wildcard 模糊查询影响性能,排除。

三、为什么会检索不到?

  1. 分词原因/词典未收录原因。
    在上文问题d中,由于分词器中不包含“科剃”等词项,所以检索不到。
  2. postition位置不一致。
    在上文问题e中,由于分词器分词器对“飞科剃须”和“飞科剃须刀”分词的postition位置不一致,所以检索不到。
飞科剃须 飞科剃须刀
token position token position
0 0
1 1
剃须 2 剃须刀 2
剃须 3
4

四、解决方案

1. match_phrase_prefix结合slop的方案
GET my_index/_search
{"query": {"match_phrase_prefix": {"qss": {“query”:"飞科剃须",“slop”:1      //指定相邻词之间允许相隔多远。设置为0,则为完全匹配。}}}
}

能应对一部分业务。但是分析发现:slop设置不论多大、多小,都可能会引入噪音数据,导致结果不准确。

2. match_phrase结合match should关联匹配。

依然会引入噪音数据。

3. 终极方案:逐个字分词和ik分词结合的方式。
  • mapping设置:
PUT mx_index{"mappings": {"_doc": {"properties": {"qss": {"type": "text","analyzer": "ik_max_word","fields": {"standard": {"type": "text","analyzer": "standard"},"keyword": {"type": "keyword","ignore_above": 256}}}}}}
}
  • 搜索:
GET mx_index/_search
{"query": {"bool": {"should": [{"match_phrase": {"qss": "科剃"}},{"match_phrase": {"qss.standard": "科剃"}}]}}
}

Elasticsearch实现内容精确匹配查询相关推荐

  1. Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询

    本文地址: http://blog.csdn.net/hereiskxm/article/details/47979013 在有搜索引擎之前,我们查文档常使用顺序匹配.我们需要在文档中顺序扫描,找到完 ...

  2. ElasticSearch系列 - SpringBoot整合ES:短语匹配查询 match_phrase

    文章目录 1. ElasticSearch match_phrase查询是什么?它与match查询有什么区别? 2. ElasticSearch match_phrase 查询的语法是什么? 3. E ...

  3. element中组件el-autocomplete远程搜索之精确匹配和模糊匹配

    在实际开发项目中总是会遇到很多难以预测的情况, 比如el-autocomplete的远程搜索时,经常会从服务器发起搜索,然后把对象带出的相关值赋给其他标签元素,一般模糊匹配没问题,但是精确匹配会存在一 ...

  4. 【elasticsearch】elasticsearch 精确匹配 与 全文搜索

    本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载. 可以加我问问题,免费解答,有问题可以先私聊我,本人每天都在线,会帮助需要的人. 但是本博主因为某些原因, ...

  5. 49.(leaflet篇)leaflet实现反向匹配查询(ElasticSearch技术实现)(输入坐标查询距离最近的地址信息)

    地图之家总目录(订阅之前请先查看该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 关联博客: 4.(后端技术篇java)ElasticSearch实现 ...

  6. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  7. Elasticsearch 字段可以模糊查询也可完全匹配查询(实例)

    需求: 比如创建用户, 需要判断name是否重复后, 没有重复才插入数据, 创建好之后又需要模糊查询用户昵称name.  这时候name字段类型就需要具备分词并且可完全匹配搜索. 直接上代码: 创建映 ...

  8. ElasticSearch前缀匹配查询(英文检索)

    #前缀匹配查询 #前缀匹配查询 GET /lib3/user/_search {"query": {"match_phrase_prefix": {" ...

  9. (六)ElasticSearch 6.1.1聚合查询

    1 普通类型 1.1 基本操作 1.1.1 导入实战数据 数据字段如下: 字段 类型 作用 price long 汽车售价 color text 汽车颜色 make text 汽车品牌 sold da ...

  10. ElasticSearch 6.3版本(ES)查询人名关键字不拆词查询

    ElasticSearch 6.3版本(ES)查询关键字不拆词查询:类似mysql 的 like 语句. mysql的sql语法类似如下,采用大量like和locate语法,进行模糊查询,导致查询一个 ...

最新文章

  1. MySQL错误代码:MySQL Workbench中UPDATE期间的1175错误代码
  2. 5分钟解析Facebook最新推荐算法
  3. 阿里云云市场双11战报:30分钟破100万,单品销量暴涨300倍!
  4. 从DevOps到Cloud Native,应用上云姿势全解锁
  5. 上海市消保委:春节长假期间 共受理消费者投诉4600件
  6. objectC时间用法
  7. 谁说EMC、IBM不能替换,还你一个存储虚拟化的真相!
  8. 3.9 拆解小红书爆文,流量密码原来是这些【玩赚小红书】
  9. ScrollMagic结合TweenMax的Demo
  10. 云效首发应用交付和项目协作新品,助力企业DevOps到BizDevOps
  11. pyqt5 时间控件设为当前日期
  12. 单元测试和E2E测试
  13. ubuntu16.04成功安装 百度网盘 by deepin-wine-for-ubuntu
  14. 【代码】HTML网站维护更新简易单页源码
  15. python 资源文件_如何用 Python 正确读取资源文件
  16. Part2:S3C2440裸跑一个LED程序
  17. 陶瓷工厂的进销存管理系统的设计与实现
  18. Hadoop之机架感知
  19. 一只前端程序媛的絮絮叨叨
  20. 一文了解,如何在VMware指定磁盘分区 扩容

热门文章

  1. IIS 中 HTTPS 自签名证书 的使用
  2. python新版个人所得税代码_个人所得税计算代码
  3. PR模板 有趣的波普艺术网络自媒体宣传PR视频模板
  4. Error: ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk 解决
  5. Ubuntu 建立局域网
  6. 介绍几款AI开源平台
  7. 【Java程序员面试】直接被SpringBoot干趴?NONONO!拒绝做冤大头!!
  8. Oracle数据库 1653错误
  9. 基于STM32单片机设计的红外测温仪(带人脸检测)
  10. iOS开发IPhone以及iPad尺寸汇总