在实际的搜索中,我们有时候会打错字,从而导致搜索不到。在Elasticsearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。

match查询具有“fuziness”属性。它可以被设置为“0”, “1”, “2”或“auto”。“auto”是推荐的选项,它会根据查询词的长度定义距离。

Fuzzy query

返回包含与搜索词相似的词的文档,以Levenshtein编辑距离测量。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。 这些更改可以包括:

  • 更改字符(box→fox)
  • 删除字符(black→lack)
  • 插入字符(sic→sick)
  • 转置两个相邻字符(act→cat)

为了找到相似的词,模糊查询会在指定的编辑距离内创建搜索词的所有可能变化或扩展的集合。 查询然后返回每个扩展的完全匹配。

例子

我们首先输入如下的一个文档到fuzzyindex索引中:

    PUT fuzzyindex/_doc/1
{
"content": "I like blue sky"
}

如果这个时候,我们进行如下的搜索:

    GET fuzzyindex/_search
{
"query": {
"match": {
"content": "ski"
}
}
}

那么是没有任何被搜索到的结果,这是因为“I like blue sky" 里分词后没有ski这个词。

    {
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}

这个时候,如果我们使用如下的搜索:

    GET fuzzyindex/_search
{
"query": {
"match": {
"content": {
"query": "ski",
"fuzziness": "1"
}
}
}
}

那么显示的结果是:

    {
"took" : 18,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.19178805,
"hits" : [
{
"_index" : "fuzzyindex",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.19178805,
"_source" : {
"content" : "I like blue sky"
}
}
]
}
}

显然是找到我们需要的结果了。这是因为sky和ski时间上是只差别一个字母。

同样,如果我们选用“auto”选项看看:

    GET fuzzyindex/_search
{
"query": {
"match": {
"content": {
"query": "ski",
"fuzziness": "auto"
}
}
}
}

它显示的结果和上面的是一样的。也可以进行匹配。

如果我们进行如下的匹配:

    GET fuzzyindex/_search
{
"query": {
"match": {
"content": {
"query": "bxxe",
"fuzziness": "auto"
}
}
}
}

那么它不能匹配任何的结果,但是,如果我们进行如下的搜索:

    GET fuzzyindex/_search
{
"query": {
"match": {
"content": {
"query": "bxxe",
"fuzziness": "2"
}
}
}
}

我们也可以使用如下的格式:

    GET /_search
{
"query": {
"fuzzy": {
"content": {
"value": "bxxe",
"fuzziness": "2"
}
}
}
}

那么它可以显示搜索的结果,这是因为我们能够容许两个编辑的错误。

模糊性是拼写错误的简单解决方案,但具有很高的CPU开销和非常低的精度。

参考:

【1】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-fuzzy-query.html

Elasticsearch:fuzzy 搜索 (模糊搜索)的更多相关文章

  1. 十九种Elasticsearch字符串搜索方式终极介绍

    前言 刚开始接触Elasticsearch的时候被Elasticsearch的搜索功能搞得晕头转向,每次想在Kibana里面查询某个字段的时候,查出来的结果经常不是自己想要的,然而又不知道问题出在了哪 ...

  2. Elasticsearch实现搜索推荐词

    本篇介绍的是基于Elasticsearch实现搜索推荐词,其中需要用到Elasticsearch的pinyin插件以及ik分词插件,代码的实现这里提供了java跟C#的版本方便大家参考. 1.实现的结 ...

  3. Elasticsearch 为了搜索

    前言 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上. Lucene 可以说是当下最先进.高性能.全功能的搜索引擎库--无论是开源还是 ...

  4. ElasticSearch位置搜索

    ElasticSearch位置搜索 学习了:https://blog.csdn.net/bingduanlbd/article/details/52253542 学习了:https://blog.cs ...

  5. ElasticSearch入门-搜索(java api)

    ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...

  6. PHP使用ElasticSearch做搜索

    PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...

  7. Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0

    Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...

  8. Elasticsearch深入搜索之全文搜索及JavaAPI使用

    一.基于词项与基于全文 所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段. 和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以 ...

  9. ElasticSearch深入搜索

    一. 结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见 ...

随机推荐

  1. 【DSP开发】帮您快速入门 TI 的 Codec Engine

    德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶 德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了.继DM644x之后,TI又陆续推出了D ...

  2. 最新 人民网java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.人民网等10家互联网公司的校招Offer,因为某些自身原因最终选择了人民网.6.7月主要是做系统复习.项目复盘.LeetCo ...

  3. JavaScript里的类和继承(转)

    转自: http://www.h5cn.com/js/jishu/2016/0121/17634.html js与大部分客户端语言有几点明显的不同: JS是 动态解释性语言,没有编译过程,它在程序运行 ...

  4. 利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据

    利用js对象将iframe数据缓存, 实现子页面跳转后, 返回时不丢失之前填写的数据 实现描述:将数据存放在js对象中, 然后放在父页面的document对象中, 在页面刷新的时候将父页面的值取出来, ...

  5. Java模版引擎之Freemarker

    Java模版引擎之Freemarker freemarker是一款模版引擎,是一种基于模版生成静态文件的通用工具,它是为Java程序员提供的一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌 ...

  6. Colossal Fibonacci Numbers! UVA - 11582(快速幂,求解)

    Problem Description The i’th Fibonacci number f(i) is recursively defined in the following way: •f(0 ...

  7. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  8. S03_CH01_AXI_DMA_LOOP 环路测试

    S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...

  9. NameValuePair 简单名称值对节点类型

    /// <summary> /// 组装普通文本请求参数用于post请求 /// </summary> /// <param name="parameters& ...

  10. hdu 4826 三维dp

    dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据 这个的填充是个坑..#include<iostream> #include<cstdio> #inc ...