[Elasticsearch] 部分匹配 (三) – 查询期间的即时搜索[通俗易懂]

[Elasticsearch] 部分匹配 (三) – 查询期间的即时搜索

大家好,又见面了,我是全栈君。

本章翻译自Elasticsearch官方指南的Partial Matching一章。

查询期间的即时搜索(Query-time Search-as-you-type)

如今让我们来看看前缀匹配可以怎样帮助全文搜索。

用户已经习惯于在完毕输入之前就看到搜索结果了 – 这被称为即时搜索(Instant Search, 或者Search-as-you-type)。这不仅让用户可以在更短的时间内看到搜索结果。也可以引导他们得到真实存在于我们的索引中的结果。

比方。假设用户输入了johnnie walker bl,我们会在用户输入完毕前显示Johnnie Walker Black Label和Johnnie Walker Blue Label相关的结果。

和往常一样,有多种方式可以达到我们的目的。首先我们从最简单的方式開始。你不须要以不论什么的方式准备你的数据,就行在不论什么全文字段(Full-text Field)上实现即时搜索。

短语匹配(Phrase Matching)中。我们介绍了match_phrase查询,它可以依据单词顺序来匹配全部的指定的单词。对于查询期间的即时搜索,我们可以使用该查询的一个特例,即match_phrase_prefix查询:

{
    "match_phrase_prefix" : {
        "brand" : "johnnie walker bl"
    }
}

次查询和match_phrase查询的工作方式基本同样。除了它会将查询字符串中的最后一个单词当做一个前缀。换言之,前面的样例会查找下面内容:

  • johnnie
  • 紧接着的是walker
  • 紧接着的是以bl开头的单词

假设我们将该查询通过validate-query API运行,它会产生例如以下的解释:

“johnnie walker bl*”

和match_phrase查询一样。它可以接受一个slop參数(參见这里)来让单词间的顺序和相对位置不那么严格:

{
    "match_phrase_prefix" : {
        "brand" : {
            "query": "walker johnnie bl", 
            "slop":  10
        }
    }
}

可是,查询字符串中的最后一个单词总是会被当做一个前缀。

在之前介绍prefix查询的时候,我们谈到了prefix查询的一些须要注意的地方 – prefix查询时怎样消耗资源的。在使用match_phrase_prefix查询的时候,也面临着相同的问题。一个前缀a你可以匹配很许多的词条。匹配这么多的词条不仅会消耗许多资源,同一时候对于用户而言也是没有多少用处的。

我们能够通过将參数max_expansions设置成一个合理的数值来限制前缀扩展(Prefix Expansion)的影响,比方50:

{
    "match_phrase_prefix" : {
        "brand" : {
            "query":          "johnnie walker bl",
            "max_expansions": 50
        }
    }
}

max_expansions參数会控制可以匹配该前缀的词条的数量。它会找到首个以bl开头的词条然后開始收集(以字母表顺序)直到全部以bl开头的词条都被遍历了或者得到了比max_expansions很多其它的词条。

不要忘了在用户每敲入一个字符的时候。该查询就要被运行一次。因此它的速度须要快。假设第一个结果集不符合用户的期望,那么他们就会继续输入直到得到他们须要的结果。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115778.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mvc与三层结构终极区别[通俗易懂]

    mvc与三层结构终极区别[通俗易懂]注:本文章内所有内容都来自互联网,本人主要是起了一个收集的作用http://www.cnblogs.com/zhhh/archive/2011/06/10/2077519.html又看到有人在问三层架构和MVC的关系,感觉这种问题有点教条化了。因为它们都在逻辑上将应用程序划为三块,凑了一个数字3,就有人非要把它们联系到一起了。  这两个东西我接触有几年了,有一点体会,表达一下:

  • 约瑟夫环——公式法(递推公式)

    约瑟夫环——公式法(递推公式)约瑟夫问题约瑟夫问题是个有名的问题:N个人围成一圈,第一个从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个个人,把他们叫做A、B、C围成一圈,从A开始报数,报2的人被杀掉。A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数然后轮到A报数,他报2。也被杀死了。最终胜利者是C解决方案普通解

  • JAVA反射机制

    JAVA反射机制

  • 招聘考试图形推理题_图形推理历年真题

    招聘考试图形推理题_图形推理历年真题图形推理50中规律,自行阅读1.大小变化2.方向旋转3.笔画增减(数字,线条数)4.图形求同5.相同部份去掉6.图形叠加(简单叠加,合并叠加,去同叠加)7.图形组合变化(如:首尾两个图形中都包含中间图形)8.对应位置阴影变化(两图相同或不同则第三图对应位置变阴影或变空白)9.顺时针或逆时针旋转10.总笔画成等差数列…

  • 两个服务通过http传输excel文件

    两个服务通过http传输excel文件两个服务通过http传输excel文件

  • perl正则表达式实现大写字母转小写字母

    perl正则表达式实现大写字母转小写字母这个功能不难,但是要求必须用s///的形式,而且后面不能加第三个参数,不能是s///g这样的形式。不过可以采用多个这样的表达式。例如 s/A/a/s/B/b/s/AB/ab/…………….最终就是要求所有这些表达式组合起来,使得不论输入多少个大写字符,都会被转化为小写。我在atftpd的pcre功能中需要我将大写的请求文件转化为小写,所以需要一个rules文件

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号