Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >探究 | 明明存在,怎么搜索不出来呢?

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

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

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ES系列07:match_phrase与match_phrase_prefix query
ps:如果没看明白,那就来看下match_phrase query对应到mysql是怎样的吧!
方才编程_公众号同名
2020/11/13
2.7K0
ES系列07:match_phrase与match_phrase_prefix query
elasticsearch深入搜索一之近似匹配
1. 从上面几种分词器的对比中可以看出,拼音分词器主要是把中文转换成拼音的方式进行分词; 2. ik_max_word分词和ik_smart分词器主要是索引单词而不是索引独立的单词; 3. standard分词器主要是索引独立的单词而不对词项进行索引。
山行AI
2019/06/28
2.9K0
Elasticsearch搜索特性
方案一、可以是用wildcard通配符,但是要设置不分词,这种方案性能不好 方案二、可以使用ngram分词器 “min_gram”: 2,”max_gram”: 3 单词假设是 abcde0001 ab bc cd abc cde 001.。。。等等 被分词2个字母一组和3个字符一组。。、。
丁D
2022/08/12
8400
Elasticsearch 电商场景:明明有这个关键词,但是搜不出来,怎么办?
content是一个text类型,用的 ik_max_word 分的词,需要根据关键词做精准匹配,并且按照发布时间倒序。
铭毅天下
2024/05/17
4390
Elasticsearch 电商场景:明明有这个关键词,但是搜不出来,怎么办?
Elasticsearch实战 | match_phrase搜不出来,怎么办?
1、问题抛出 某个词组在Elasitcsearch中的某个document中存在,就一定通过某种匹配方式把它搜出来。 举例: title=公路局正在治理解放大道路面积水问题。 输入关键词:道路,能否
铭毅天下
2018/03/20
2.3K0
Elasticsearch实战 | match_phrase搜不出来,怎么办?
Elasticsearch解决问题之道——请亮出你的DSL!
以上的看似复杂的问题,如果转换成DSL,清楚的写出来,梳理清楚问题的来龙去脉,问题就自然解决了一大半。
铭毅天下
2019/08/13
2.9K0
Elasticsearch解决问题之道——请亮出你的DSL!
Elasticsearch 警惕使用 wildcard 检索!然后呢?
全局认知非常重要,检索核心类型大致(非严谨、精确)分为:精准匹配检索(Term-level queries)和基于分词的全文匹配检索(Full text queries)。
铭毅天下
2021/04/12
6.4K0
Elasticsearch 警惕使用 wildcard 检索!然后呢?
全局认知非常重要,检索核心类型大致(非严谨、精确)分为:精准匹配检索(Term-level queries)和基于分词的全文匹配检索(Full text queries)。
全栈程序员站长
2022/11/17
1.3K0
Elasticsearch 警惕使用 wildcard 检索!然后呢?
【转】Elasticsearch学习 查询(prefix、wildcard、regexp、fuzzy)
比如computer这个单词,本身是一个词项,index_prefixes可以为这个单词再创建倒排索引,min_chars=2,max_chars=5的话,创建的索引:co、com、comp、compu
保持热爱奔赴山海
2025/06/03
2120
Elasticsearch使用:Match_phrase查询
我们可以将一个简单的 match 查询作为一个 must 子句。 这个查询将决定哪些文档需要被包含到结果集中。 我们可以用 minimum_should_match 参数去除长尾。 然后我们可以以 should 子句的形式添加更多特定查询。 每一个匹配成功的都会增加匹配文档的相关度。
HLee
2021/03/30
7.4K0
Elasticsearch使用:Match_phrase查询
Elasticsearch搜索查询语法
原文地址为https://www.cnblogs.com/haixiang/p/12095578.html,转载请注明出处! es与SpringBoot的整合以及常用CRUD、搜索API已被作者封装,开箱即用效果很好,欢迎star谢谢!github
海向
2019/12/26
1.4K0
由 Elasticsearch 空间换时间的线上问题说开去......
2、现况:搜索商品A的SPUCodeText编码:OWBB050,slop设置为49-54无法查询出该商品;slop设置为55及其以上的值,才可以查询出商品A;
铭毅天下
2022/12/22
6310
由 Elasticsearch 空间换时间的线上问题说开去......
ES系列08:Full text queries(3) query_string系列
content.ik_smart_analyzer 字段的倒排列表【Posting List】
方才编程_公众号同名
2020/11/13
1K0
ES系列08:Full text queries(3) query_string系列
看完这篇还不会 Elasticsearch 搜索,那我就哭了!
本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性。
武培轩
2020/03/13
8640
Elasticsearch学习随笔与Scrapy中Elasticsearch的应用
节点: 一个节点是集群中的一个服务器,由一个名字来标识,默认是一个随机的漫画角色的名字
咸鱼学Python
2019/06/18
2K0
ElasticSearch权威指南:深入搜索(中)
查询很少是简单一句话的 match 匹配查询。通常我们需要用相同或不同的字符串查询一个或多个字段,也就是说,需要对多个查询语句以及它们相关度评分进行合理的合并。
HLee
2021/03/19
3.4K0
ElasticSearch权威指南:深入搜索(中)
Elasticsearch基础(四):Elasticsearch语法与案例介绍
Elasticsearch采用REST API,所有的操作都可通过REST API完成,例如增删改查、别名配置等。
Lansonli
2025/05/24
3490
Elasticsearch基础(四):Elasticsearch语法与案例介绍
从提高 Elasticsearch 搜索体验说开去......
注意:我输入的是“触发器”,返回结果第一条没有问题,其他几条有关:“触”、“发”的,可以说和我的搜索没有关系。
铭毅天下
2020/10/09
7890
从提高 Elasticsearch 搜索体验说开去......
重构实践:基于腾讯云Elasticsearch搭建QQ邮箱全文检索
导语 | 随着用户邮件数量越来越多,邮件搜索已是邮箱的基本功能。QQ 邮箱于 2008 年推出的自研搜索引擎面临着存储机器逐渐老化,存储机型面临淘汰的境况。因此,需要搭建一套新的全文检索服务,迁移存储数据。本文将介绍 QQ 邮箱全文检索的架构、实现细节与搜索调优。文章作者:干胜,腾讯后台研发工程师。 一、重构背景 QQ 邮箱的全文检索服务于2008年开始提供,使用中文分词算法和倒排索引结构实现自研搜索引擎。设计有二级索引,热数据存放于正排索引支持实时检索,冷数据存放于倒排索引支持分词搜索。在使用旧全文检索
腾讯云大数据
2020/11/02
3.7K0
十九种Elasticsearch字符串搜索方式终极介绍
刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪里。出现这个问题归根结底是因为对于Elasticsearch的底层索引原理以及各个查询搜索方式的不了解,在Elasticsearch中仅仅字符串相关的查询就有19个之多,如果不弄清楚查询语句的工作方式,应用可能就不会按照我们预想的方式运作。这篇文章就详细介绍了Elasticsearch的19种搜索方式及其原理,老板再也不用担心我用错搜索语句啦!
用户7353950
2022/05/10
1.4K0
推荐阅读
相关推荐
ES系列07:match_phrase与match_phrase_prefix query
更多 >
交个朋友
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
加入架构与运维趋势交流群
技术趋势前瞻 架构演进方向
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档