首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探究 | 明明存在,怎么搜索不出来呢?

探究 | 明明存在,怎么搜索不出来呢?

作者头像
铭毅天下
发布于 2018-12-29 04:32:05
发布于 2018-12-29 04:32:05
1.2K02
代码可运行
举报
文章被收录于专栏:铭毅天下铭毅天下
运行总次数:2
代码可运行

1、题记

题出有因:

有位医生朋友在QQ留言,说对于专业词汇,检索不到怎么办? 举例:搜索:痉湿暍病 结合了国内的多款分词插件,竟然搜索不到?

2、共性认知

2.1 为什么需要分词?

wildcard模糊匹配不也可以全字段模糊查询,进而得到结果呢? 但是,当文档结果集非常大,模糊匹配必然会有性能问题。

搜索引擎的为什么能快速检索到自己查询的关键字呢?倒排索引是以O(1)时间复杂度,一招解决问题的关键。

没有词语,怎么建立索引呢?于是,我们需要中文分词!

并且分词发生在用户查询服务器建立索引时。

2.2 查全率 VS 查准率

查全率=(检索出的相关信息量/系统中的相关信息总量)100%

查准率=(检索出的相关信息量/检索出的信息总量)100%

前者是衡量检索系统和检索者检出相关信息的能力,后者是衡量检索系统和检索者拒绝非相关信息的能力。两者合起来,即表示检索效率。

3、Elasticsearch 多种检索类型选型指南

3.1 match检索

含义:精细化切词匹配,只要待匹配的语句中,有一个满足检索结果,就能匹配到。

场景:结果可能达不到实际开发预期。实际业务中但凡有精准度要求的都较少或几乎不使用。

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1PUT doctor_index/_doc/4
2{
3  "content":"刘强东方才只是睡觉了,并没有违法"
4}

我输入检索词

“小王睡觉”

,也能匹配到上面的content。

3.2match_phrase:短语匹配

含义:相比match,更强调多个分词结果和顺序,都要完整匹配才能检索到。 场景:实战应用中会较多使用,结合slop调整顺序和精度。

3.3 query_string

含义:支持与(AND)、或(OR)、非(NOT)的匹配。

场景:有与或非多值匹配的场景,无需单独再开发,开箱即用。底层的关键词实际走的是match_phrase,

不过多个参数(如:default_operator,phrase_slop等)可控制调整精度。 举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1GET /_search
2{
3    "query": {
4        "query_string" : {
5            "default_field" : "content",
6            "query" : "刘强东 AND 无罪"
7        }
8    }
9}

4、为什么会检索不到?

结合几个典型例子,实践分析一把。

4.1 分词原因/词典未收录原因

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1PUT doctor_index/_doc/3
 2{
 3  "content":"佟大为老婆生了孩子"
 4}
 5POST doctor_index/_search
 6{
 7"profile":"true", 
 8  "query": {
 9    "match_phrase": {
10      "content": "佟大"
11    }
12  }
13}

包含”佟大”,但是短语匹配搜索不到。 原因分析: 来看看切词,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1GET /_analyze
2{
3  "text":"佟大为老婆生了孩子",
4  "analyzer": "ik_max_word"
5}

token

start_offset

end_offset

position

佟大为

0

3

0

大为

1

3

1

1

2

2

2

3

3

老婆

3

5

4

3

4

5

4

5

6

生了

5

7

7

5

6

8

6

7

9

孩子

7

9

10

搜索:佟大,如果执意也要搜出结果呢?

token

start_offset

end_offset

position

0

1

0

1

2

1

分析可知:佟大两个字组成的连词,没有作为词组分配的,所以匹配不到。

4.2 postition位置不一致。

假定我字典里面没有收录“刘强东”这个人名。 举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1PUT doctor_index/_doc/4
 2{
 3  "content":"刘强东方才只是睡觉了,并没有违法"
 4}
 5POST doctor_index/_search
 6{
 7  "query": {
 8    "match_phrase": {
 9      "content": "刘强东"
10    }
11  }
12}

原因分析:

token

position

刘强

0

东方

1

方才

2

3

4

只是

5

睡觉

6

7

觉了

8

9

10

并没有

11

并没

12

13

没有

14

15

违法

16

17

而刘强东的分词结果是:

token

position

刘强

0

1

match_phrase匹配必须:

position一致,可以上下对比一下,由于东方组成了短语,导致结果position不一致,匹配结果检索不到。

5、如何让存在的字符都能搜索到呢?

5.1 关于match_phrase的精确度问题

方案一:match_phrase_prefix结合slop的方案 参见:Elasticsearch实战 | match_phrase搜不出来,怎么办?

但是,事后分析发现:slop设置不论多大、多小,都可能会引入噪音数据,导致结果不准确

方案二:match_phrase结合match should关联匹配。 缺点:依然会引入噪音数据。

5.2 参考阿里云的实践思路,采取:逐个字分词和ik分词结合的方式。

单字分词应用场景——对于像姓名类字段,业务上需要支持完整匹配,又需要支持单字查询。可以配置1个keyword字段(不分词);

1个text字段(分词),分词器选择Elasticsearch默认分词器standard,按单个汉字切分。

5.3 实践一把

我们处理问题的前提:提升查全率。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1PUT mx_index
 2{
 3  "mappings": {
 4    "_doc": {
 5      "properties": {
 6        "content": {
 7          "type": "text",
 8          "analyzer": "ik_max_word",
 9          "fields": {
10            "standard": {
11              "type": "text",
12              "analyzer": "standard"
13            },
14            "keyword": {
15              "type": "keyword",
16              "ignore_above": 256
17            }
18          }
19        }
20      }
21    }
22  }
23}
24
25PUT mx_index/_doc/1
26{
27  "content":"佟大为老婆生了孩子"
28}
29
30POST mx_index/_search
31{
32  "query": {
33    "bool": {
34      "should": [
35        {
36          "match_phrase": {
37            "content": "佟大"
38          }
39        },
40        {
41          "match_phrase": {
42            "content.standard": "佟大"
43          }
44        }
45      ]
46    }
47  }
48}

6、小结

不是放之四海而皆准的实现方式。要看你的系统对查全率和查准率的要求了,正常的业务场景:

  • 1)动态更新词库、词典
  • 2)match_phrase结合slop就能解决问题。

所以,一定要结合自己的业务场景。 相信这么处理,开头医生的需求也能实现了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ROS新功能包PlotJuggler绘图
http://www.ros.org/news/2017/01/new-package-plotjuggler.html
zhangrelay
2022/05/10
1.1K0
[ROS2]数据回放伴侣Rviz+plotjuggler
PlotJuggler是一个类似于rqt_plot的基于Qt的数据可视化工具。但PlotJuggler拥有更强大和好用的功能。你可以导入文本文件让它显示文本文件中的数据。你也可以导入ros的bag包,它能自动解析bag包中的数据。并可以回放bag包的数据,然后用Rviz来显示数据。PlotJuggler的功能有很多,这里只介绍几种我常用的功能。应该足以应付日常的机器人开发调试工作。
首飞
2022/05/01
1.5K0
[ROS2]数据回放伴侣Rviz+plotjuggler
Havoc:一款现代化可扩展的后渗透命令控制框架
Havoc已经在Debian 10/11、Ubuntu 20.04/22/04以及Kali Linux操作系统上进行过完整测试。我们建议大家使用最新版本的Havoc以避免遇到其他问题。除此之外,建议使用最新版本的Qt和Python 3.10.x来完成代码构建。
FB客服
2023/02/10
1.3K0
Havoc:一款现代化可扩展的后渗透命令控制框架
ROS机器人项目开发11例-ROS Robotics Projects(8)自动驾驶汽车
自动驾驶汽车近年来非常热门,也是本书第10章的内容,优酷小站也分享过很多这方面主题的视频。
zhangrelay
2019/01/23
1.2K0
Qt开发麒麟Linux桌面应用程序的流程
Qt 开发麒麟 Linux 桌面应用程序的流程与在通用 Linux 发行版(如 Ubuntu, Fedora 等)上开发Qt应用程序的流程非常相似,因为麒麟 Linux 本质上也是一个基于 Linux 内核的操作系统。主要的区别在于,麒麟 Linux 在 UI 方面有其独特的 UKUI (Ultimate Kylin User Interface) 桌面环境,而 UKUI 本身就大量使用了 Qt 技术。这意味着 Qt 应用程序在麒麟系统上通常会有很好的原生集成度。
数字孪生开发者
2025/05/30
4510
Qt开发麒麟Linux桌面应用程序的流程
还在内卷CS?快来享用Havoc
接着点击Attack - Payload选择Windows Shellcode,点击Generate将shellcode保存
MssnHarvey
2022/11/14
1.4K0
还在内卷CS?快来享用Havoc
测评活动分享
在点云PCL公众号相机测评活动的支持下,首先拿到了小觅相机,所以这篇文章将对小觅MYNTEYE-S1030-IR在ORB-SLAM2和RTAB-Map两种SLAM方案下的效果进行测评,为了增强对比效果会和我自制双目摄像头进行对比。同时这还是一篇干货满满的技术文章,我会写下详细的实验环境搭建步骤,相信你会学到很多东西!下面开始快乐的学习旅程吧!
点云PCL博主
2019/08/28
2.3K0
测评活动分享
ROS机器人编程:原理与应用(A Systematic Approach to Learning Robot Programming with ROS 中文译版)
(A Systematic Approach to Learning Robot Programming with ROS)
zhangrelay
2022/04/29
1.3K0
ROS机器人编程:原理与应用(A Systematic Approach to Learning Robot Programming with ROS 中文译版)
ROS机器人程序设计(原书第2版)补充资料 (零) 源代码、资料和印刷错误修订等 2017年02月22日更新
可参考:https://www.shiyanlou.com/courses/854  邀请码 U23ERF8H
zhangrelay
2019/01/23
8100
越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩
Magician Robotarm ====== 本文件夹中包含了多个为Magician机械臂提供ROS支持的软件包。推荐的运行环境为 Ubuntu 16.04 + ROS Kinetic 或 Ubuntu 18.04 + ROS Melodic,其他环境下的运行情况没有测试过。
zhangrelay
2019/08/29
2.7K1
越疆科技dobot(magician)机械臂在ROS moveit下gazebo仿真控制和真实控制功能包 有兴趣的可以下载来玩
https://github.com/CPFL/Autoware 自动驾驶框架比较齐全
Integrated open-source software for urban autonomous driving, maintained by Tier IV. The following functions are supported:
CreateAMind
2018/07/24
2K0
https://github.com/CPFL/Autoware 自动驾驶框架比较齐全
Fast-Lio SLAM.上篇
工友在机器上面编译了好几天也失败了,后面又换了MAC(笑死M1的片子,开虚拟机编译)又是报错的一天。
云深无际
2022/11/29
9620
Fast-Lio SLAM.上篇
深度相机Astra Pro测试教程
最近在微信群内,很多群友在群友的推荐下,购买了Astra pro的深度相机,价格地道,物超所值!群友反馈积极,所以这里出一波简单的教程。以下内容抛砖引玉,主要讲解windows下和Ubuntu上的测试用例。希望有其他相关分享的小伙伴可以联系dianyunpcl@163.com
点云PCL博主
2019/07/30
4.7K0
深度相机Astra Pro测试教程
rgbd slam v2_rgb数据格式
首先rgbdslamv2 是2014年开源出来的一个机遇RGBD相机构建点云地图的框架【1】,作者已经在github上开源出了代码【2】,并且给出了一个一键安装的脚本(install.sh)。但是我们会发现,我们直接运行这个install脚本会在~/Code目录下创建一个rgbdslam_catkin_ws 工作空间,然后我们按照传统的catkin_make命令进行编译会发现代码直接编译通过,,不会提示任何错误信息,但是在使用命令
全栈程序员站长
2022/09/29
5200
rgbd slam v2_rgb数据格式
ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)
國防科學技術大學發布了RoboCup中型組仿真平臺,基於ROS和Gazebo設計。
zhangrelay
2019/01/23
5032
ROS_Kinetic_22 使用ROS的qt插件即ros_qtc_plugin实现Hi ROS!!!!
https://github.com/ros-industrial/ros_qtc_plugin/wiki
zhangrelay
2019/01/23
1.7K0
(一)ROS系统入门 Getting Started with ROS 以Kinetic为主更新 附课件PPT
ROS机器人程序设计(原书第2版)补充资料 教案1 ROS Kinetic系统入门
zhangrelay
2019/01/23
3.5K0
基于ROS的Most Stars开源代码汇总(自动驾驶汽车+RGBDSLAMv2+ROS2+人识别与跟踪等)
Autoware受BSD许可证保护。请自行负责使用。为了安全使用,我们为不拥有真正自主车辆的人提供基于ROSBAG的仿真方法。如果您使用Autoware与真正的自主车辆,请在现场测试之前制定安全措施和风险评估。
zhangrelay
2022/04/29
2.9K0
基于ROS的Most Stars开源代码汇总(自动驾驶汽车+RGBDSLAMv2+ROS2+人识别与跟踪等)
ROS_Kinetic_04 ROS基础内容(一)
在使用ROS期间,一定要确保环境变量配置正确,通常是source不同的setup.bash。
zhangrelay
2019/01/23
1.1K0
10.YOLO系列及如何训练自己的数据。
SSD失败之后就挺失望的,而且莫名其妙,于是转向YOLO了,其实object detection领域可选的模型并不多,RCNN系列我是大概看过的,还写过:RCNN系列,但是这种location和classification分开的思路,要达到实时的话我的硬件条件肯定是不可能的。YOLOV3我是在TX2上跑过的:YOLOV3-TX2跑起来,而且YOLO是有简化版本的模型的,对于简单应用应该是够了。 因为以前跑过,整体的流程走下来还算比较顺利,比起SSD来说,训练时要修改的代码也比较少,可能留给犯错的概率就少一些。 我分以下几个部分:
和蔼的zhxing
2018/12/07
1.8K0
推荐阅读
相关推荐
ROS新功能包PlotJuggler绘图
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验