2023-02-09 Elasticsearch 模糊搜索

news2024/11/28 2:45:14

1 prefix 前缀搜索

在这里插入图片描述

以前缀开头的搜索,不计算相关度得分

前缀搜索匹配的是term,而不是field。
前缀搜索的性能很差
前缀搜索没有缓存
前缀搜索尽可能把前缀长度设置的更长

针对于中文分词器
在这里插入图片描述
index_prefixes: 默认 “min_chars” : 2, “max_chars” : 5

PUT /user
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "index_prefixes": {
          "min_chars": 2,
          "max_chars": 5
        },
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      }
    }
  }
}

在这里插入图片描述

2 wildcard 通配符搜索

通配符运算符是匹配一个或多个字符的占位符。例如,*通配符运算符匹配零个或多个字符。您可以将通配符运算符与其他字符结合使用以创建通配符模式。

通配符匹配的也是term,而不是field
在这里插入图片描述
keyword
在这里插入图片描述
在这里插入图片描述

3 regexp 正则搜索-几乎不用

regexp查询的性能可以根据提供的正则表达式而有所不同。为了提高性能,应避免使用通配符模式,如.或 .?+未经前缀或后缀

ALL
启用所有可选操作符

COMPLEMENT

启用~操作符。可以使用~对下面最短的模式进行否定。例如
a~bc # matches 'adc' and 'aec' but not 'abc'

INTERVAL

启用<>操作符。可以使用<>匹配数值范围。例如
foo<1-100> # matches 'foo1', 'foo2' ... 'foo99', 'foo100'
foo<01-100> # matches 'foo01', 'foo02' ... 'foo99', 'foo100'

INTERSECTION

启用&操作符,它充当AND操作符。如果左边和右边的模式都匹配,则匹配成功。例如:
aaa.+&.+bbb # matches 'aaabbb'

ANYSTRING

启用@操作符。您可以使用@来匹配任何整个字符串。 您可以将@操作符与&~操作符组合起来,创建一个“everything except”逻辑。例如:
@&~(abc.+) # matches everything except terms beginning with 'abc'

在这里插入图片描述
在这里插入图片描述

4 fuzzy 模糊搜索

混淆字符 (box → fox)

缺少字符 (black → lack)

多出字符 (sic → sick)

颠倒次序 (act → cat)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

fuzziness:编辑距离,(012)并非越大越好,召回率高但结果不准确

两段文本之间的Damerau-Levenshtein距离是使一个字符串与另一个字符串匹配所需的插入、删除、替换和调换的数量

距离公式:Levenshtein是lucene的,es改进版:Damerau-Levenshtein,

axe=>aex 
Levenshtein=2Damerau-Levenshtein=1

在这里插入图片描述
transpositions:(可选,布尔值)指示编辑是否包括两个相邻字符的变位(ab→ba)。默认为true。 替换这种情况!!!

在这里插入图片描述
使用fuzziness来指定模糊的范围,ES对fuzziness的的值最高只支持到2,过高的计算距离会导致过高的性能开销。

fuzziness也可以在match中支持使用
在这里插入图片描述
match的优势在于支持分词的模糊搜索,fuzzy不支持分词。

在这里插入图片描述
在这里插入图片描述
“transpositions”: false - 使用Levenshtein计算距离
“transpositions”: true - 使用Damerau-Levenshtein计算距离
在这里插入图片描述
在这里插入图片描述
在数据量特别大的时候,不推荐使用fuzzy进行模糊搜索。

5 match_phrase_prefix 短语前缀

如果要使用match_phrase进行搜索的话,必须同时满足下面3个条件,缺1不可:

match_phrase会分词
被检索字段必须包含match_phrase中的所有词项并且顺序必须是相同的
被检索字段包含的match_phrase中的词项之间不能有其他词项

而match_phrase_prefix与match_phrase虽然有很多相同的地方,但是它多了一个特性:就是它允许在文本的最后一个词项(term)上的前缀匹配。如果是一个单词,比如a,它会匹配文档字段所有以a开头的文档;如果是一个短语,比如 “this is ma” ,他会先在倒排索引中做以ma做前缀搜索,然后在匹配到的doc中做match_phrase查询。
在这里插入图片描述
在这里插入图片描述
match_phrase_prefix参数

  • analyzer 指定何种分析器来对该短语进行分词处理
  • max_expansions 限制匹配的最大词项
  • boost 用于设置该查询的权重
  • slop 允许短语间的词项(term)间隔:slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配
    什么是相隔多远? 意思是说为了让查询和文档匹配你需要移动词条多少次?

值得注意的是,max_expansions是分片级别的,也就是说即使将max_expansions设置为1,在每个分片中只匹配一个词项,如果有10个分片,就会在10个分片中分别都匹配一个,也就是一共匹配了10个,所以不等于说max_expansions设置为1,返回的结果就一定只有1个。

在这里插入图片描述
简单理解为,max_expansions设置的越小,返回的结果越少,性能越好;设置的越大,返回的结果越多,性能越差。

前面说了,使用match_phrase_prefix搜索词的顺序是不能颠倒的,但是使用slop参数可以允许指定范围内的搜索词的颠倒
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
slop的值就是词项移动的距离。

6 N-gram、edge ngram

min_gram:创建索引所拆分字符的最小阈值
max_gram:创建索引所拆分字符的最大阈值
ngram:从每一个字符开始,按照步长,进行分词,适合前缀中缀检索
edge_ngram:从第一个字符开始,按照步长,进行分词,适合前缀匹配场景
在这里插入图片描述
在这里插入图片描述

使用ngram作为分词器

在这里插入图片描述
在这里插入图片描述
使用match_phrase进行搜索是可以搜索到结果

在这里插入图片描述
但当搜索的词项的长度超过ngram作为分词器所创建索引最大长度时就搜索不到

在这里插入图片描述
同样低过ngram作为分词器所创建索引最小长度时也搜索不到

在这里插入图片描述
看到这里也就明白了,使用ngram对每个分词后的词项创建索引,需要的磁盘空间相当巨大,带来的好处就是做模糊查询的时候可以极大的缩短搜索时间。不过ngram使用起来对磁盘空间的要求相当高,一般会使用edge-ngram来创建索引。因为edge-ngram只支持前缀搜索,而ngram不仅支持前缀搜索,还支持中缀和后缀搜索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMMI落地常见4大问题及改进措施

&#xff08;一&#xff09;、CMMI落地常见的4大问题&#xff1a; 1、组织成员并非全部认可与参与 在CMMI推行过程中&#xff0c;过程改进小组EPG负责整个改进工作&#xff0c;但组织其他成员并不是全部认可和自愿参与&#xff0c;甚至有些成员认为与自己无关。从而造成EPG在推…

Spring-Data-Jpa实现继承实体类

写在前面&#xff1a;从2018年底开始学习SpringBoot&#xff0c;也用SpringBoot写过一些项目。现在对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot&#xff0c;可以关注我&#xff0c;一起学习&#xff0c;一起进步。 相关文章&#xff1a; 【Springboot系…

ZooKeeper 避坑实践: Zxid溢出导致选主

作者&#xff1a;子葵 背景 线上 flink 用户使用 ZooKeeper 做元数据中心以及集群选主&#xff0c;一些版本的 flink 在 ZooKeeper 选主时&#xff0c;会重启 Job&#xff0c;导致一些非预期的业务损失。而 ZooKeeper 在 zxid溢出时&#xff0c;会主动触发一次选主&#xff0…

复习0206

目录 一、访问修饰符 一、权限范围 二、注意事项 二、封装&#xff08;面向对象的三大特征之一&#xff09; 一、封装的好处 二、封装的实现步骤 三、和构造器结合 四、练习题中的细节 一、访问修饰符 一、权限范围 访问修饰符用于控制方法和属性&#xff08;成员变量…

Kylin构建引擎的衍生维度

目录1. 衍生维度(derived dimension)1. 衍生维度(derived dimension) 衍生维度的构建和查询过程&#xff1a; 当有一张事实表和维度表如下&#xff1a; 我们需要以city为维度字段&#xff0c;sum(salary)为度量字段&#xff0c;进行cube的构建。因为定义了city为衍生维度字段…

C++多态(上)

文章目录1. 多态的概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 虚函数重写的两个例外2.4.1 协变(基类与派生类虚函数返回值类型不同)2.4.2 析构函数的重写(基类与派生类析构函数的名字不同)2.5 重载、覆盖(重写)、隐藏(重定义)的对比3. C11 overri…

小程序酷炫动态登录页源码(动态水滴)

1. 页面效果 登陆页面一般都要酷炫好看一点&#xff0c;这里分享一个动态登录页面&#xff0c;页面有三个流动的小水滴。一个水滴放登录框。剩下两个水滴跳转页面和打开弹窗。 2. 代码内容 <template><view class"login-page"><u-gap height"…

【c语言技能树】文件

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

JVM堆内存详解

一、简介 JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障&#xff0c;在解决该问题之前&#xff0c;必须先了解下JAVA堆内存是怎么工作的。 JVM内存划分为堆内存和非堆内存&#xff0c;堆内存分为年轻代&#xff08;Young Generation&#xff09…

C语言基础(九)—— 复合类型(自定义类型)

1. 结构体1.1 概述数组&#xff1a;描述一组具有相同类型数据的有序集合&#xff0c;用于处理大量相同类型的数据运算。有时我们需要将不同类型的数据组合成一个有机的整体&#xff0c;如&#xff1a;一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐&…

ArkTS语法(声明式UI)

页面级变量的状态管理 装饰器装饰内容说明State基本数据类型&#xff0c;类&#xff0c;数组修饰的状态数据被修改时会触发组件的build方法进行UI界面更新。Prop基本数据类型修改后的状态数据用于在父组件和子组件之间建立单向数据依赖关系。修改父组件关联数据时&#xff0c;…

你真的看好低代码开发吗?

低代码开发前景如何&#xff0c;大家真的看好低代码开发吗&#xff1f;之前有过很多关于低代码的内容&#xff0c;这篇就来梳理下国内外低代码开发平台发展现状及前景。 01、国外低代码开发平台现状 2014年&#xff0c;研究机构Forrester Research发表的报告中提到“面向客户…

【Java基础】017 -- 面向对象进阶二(包、代码块、抽象类、接口、内部类)

目录 四、包和final 1、什么是包&#xff1f; 2、使用其它类的规则 ①、规则实现 ②、小结 3、final ①、示例代码 ②、常量 ③、练习 ④、小结 五、权限修饰符和代码块 1、权限修饰符的分类 2、权限修饰符的使用规则 3、代码块 ①、局部代码块&#xff08;写在…

对docker一部分问题的处理

对docker一部分问题的处理一、permission denied二、启动容器后又立即停止三、Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No URLs in mirrorlist一、permission denied 当要执行docker images 报错&#xff1a; Got permi…

iOS 变体包体构建

ipa变体安装包是指单设备架构单资源的下载包大小 变体包输出方案&#xff1a; 1、在xcode工程中Product->Archive 2、导出选择非Appstore方式&#xff0c;可选择Ad Hoc, Development, Enterprise 3、在用于设置开发分发选项的页面中&#xff0c;为 app 瘦身选取“All co…

第三章.神经网络的学习—梯度,手写数字识别2层神经网络的实现

第三章.神经网络的学习 3.2 梯度 梯度法使用梯度的信息决定前进的方向&#xff0c;在介绍梯度法之前&#xff0c;先介绍一下导数和偏导。 1.导数 1).公式&#xff1a; 2).代码实现&#xff1a; 注意&#xff1a; ①.h 1e-4不可以使用过小的值&#xff0c;会出现计算出错的问题…

室外定位靠卫星 室内定位又如何?

人类为了不让自己迷失在茫茫大自然中&#xff0c;先后发明罗盘、指南针等工具&#xff0c;卫星定位的问世&#xff0c;解决了“我在哪里”的问题。如今物联网是“信息化”时代的重要发展阶段&#xff0c;随着社会信息化水平的普遍提高&#xff0c;其社会的重要性日益显现。云计…

全国青少年编程等级考试scratch四级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1、运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08; &#xff09;A.列表…

Android 图形系统详解

概述 一个页面&#xff08;Activity&#xff09;显示到屏幕上主要经过一下几个流程&#xff1a; 启动 Activity → 创建 Window → WMS 注册 Window → SurfaceFlinger 创建 Surface → 合成 layer → 显示 主要涉及三个进程&#xff1a;App进程、System_server进程、SurfaceF…

常用的硬件端口中各个引脚代表的含义(持续更新)

常见接口 参考&#xff1a;https://blog.csdn.net/qlexcel/article/details/117429653 type-c 示意图 参考&#xff1a;https://blog.csdn.net/qlexcel/article/details/117431413&#xff0c;https://blog.csdn.net/HandsomeHong/article/details/119823915&#xff…