公号:码农充电站pro

主页:https://codeshellme.github.io

Search APIs 用于搜索聚合存储在 ES 中的数据。

1,搜索模板 Template

Search 模板使用 mustache 语言来呈现搜索请求,使得搜索请求参数化,达到开发人员与搜索工程师解耦的效果。

示例:

# 定义一个搜索模板
POST _scripts/template_name # 模板名称为 template_name
{
"script": { # 固定写法
"lang": "mustache", # 固定写法
"source": { # 固定写法
"_source": ["title", "overview"], # 返回哪些字段
"size": 20,
"query": {
"multi_match": {
"query": "{{q}}", # 搜索参数,参数名为 q
"fields": ["title", "overview"]
}
}
}
}
} # 使用模板
POST template_name/_search/template
{
"id":"template_name",
"params": { # 填写参数 q
"q": "basketball with cartoon aliens"
}
}

2,搜索建议 Suggesters

搜索建议帮助用户在输入搜索的过程中,进行自动补全或者纠错,这种功能在 ES 中通过 Suggesters 来完成。

Suggesters 会将输入的文本分解为 token,然后在索引的字典里查找相似的 Term 并返回。

ES 提供了 4 种类别的 Suggesters

  • Term suggester
  • Phrase Suggester
  • Completion Suggester
  • Context Suggester

Suggester Mode 用于指定在什么情况下给出搜索建议:

  • missing:搜索不到内容时,给出搜索建议
  • popular:推荐出现频率更高的词
  • always:无论是否存在,都给出搜索建议

2.1,Term suggester

示例:

DELETE articles

# 插入一些文档
POST articles/_bulk
{ "index" : { } }
{ "title_completion": "lucene is very cool"}
{ "index" : { } }
{ "title_completion": "Elasticsearch builds on top of lucene"}
{ "index" : { } }
{ "title_completion": "Elasticsearch rocks"}
{ "index" : { } }
{ "title_completion": "elastic is the company behind ELK stack"}
{ "index" : { } }
{ "title_completion": "Elk stack rocks"}
{ "index" : {} }

term-suggestion 搜索:

POST /articles/_search
{
"size": 1,
"query": {
"match": {
"body": "lucen rock" # 查询字符串,拼写错误
}
},
"suggest": { # 搜索建议
"term-suggestion": { # suggester 名称,自定义
"text": "lucen rock", # 这里也是查询字符串
"term": { # term-suggestion
"suggest_mode": "missing", # 建议模式,在没有搜索到时,到 body 字段搜索
"field": "body" # 建议字段
}
}
}
}

一些参数:

  • sort:排序方法,默认按照评分排序,也可以按照 frequency 排序。
  • prefix_length:默认情况下,首字母不一致就不会给出建议词。如果将其设置为 0,就会为 hock 建议 rock。

示例:

POST /articles/_search
{ "suggest": {
"term-suggestion": {
"text": "lucen hocks",
"term": {
"suggest_mode": "always",
"field": "body",
"prefix_length":0,
"sort": "frequency"
}
}
}
}

2.2,Phrase Suggester

Phrase SuggesterTerm Suggester 的基础上增加了一些额外的逻辑。

一些参数:

  • max_errors:最多可以拼错的 Terms 数
  • confidence:限制返回结果数,默认为 1。值为 0 的话,表示返回前 N 个结果。

示例:

POST /articles/_search
{
"suggest": {
"my-suggestion": { # 一个 Suggester,自定义名称
"text": "lucne and elasticsear rock hello world ", # 搜索字符串
"phrase": { # phrase-suggestion
"field": "body",
"max_errors":2,
"confidence":0,
"direct_generator":[{
"field":"body",
"suggest_mode":"always"
}],
"highlight": {
"pre_tag": "<em>",
"post_tag": "</em>"
}
}
}
}
}

2.3,Completion Suggester

Completion Suggester 用于自动补全,用户每输入一个字符,就需要即时发送一个查询请求到后端查找匹配项。

自动补全功能对性能要求比较高, ES 采用了不同的数据结构,而非通过倒排索引来完成。

自动补全功能将分词数据编码成 FST,与索引放在一起。FST 会被加载到内存中,以加快速度。FSF 的缺点是只能用于前缀查找

示例:

首先,字段的类型必须是 completion,该数据类型用于自动补全功能。

DELETE articles
PUT articles
{
"mappings": {
"properties": {
"title_completion":{
"type": "completion"
}
}
}
}

定义好数据类型之后才能插入数据:

POST articles/_bulk
{ "index" : { } }
{ "title_completion": "lucene is very cool"}
{ "index" : { } }
{ "title_completion": "Elasticsearch builds on top of lucene"}
{ "index" : { } }
{ "title_completion": "Elasticsearch rocks"}
{ "index" : { } }
{ "title_completion": "elastic is the company behind ELK stack"}
{ "index" : { } }
{ "title_completion": "Elk stack rocks"}
{ "index" : {} }

查询数据:

POST articles/_search?pretty
{
"size": 0,
"suggest": {
"article-suggester": { # 自定义名称
"prefix": "elk ", # 查询前缀,基于该前缀进行自动补全
"completion": { # completion
"field": "title_completion" # 字段
}
}
}
}

2.4,Context Suggester

Context Suggester 是对 Completion Suggester 的扩展,称为上下文感知推荐,可以在搜索时提供更多的上下文信息。

例如,输入 "star":

  • 咖啡相关:建议 "starbucks"
  • 电影相关:建议 "start wars"

可以定义两种类型的上下文:

  • Category:任意字符串
  • Geo:地理位置信息

实现 Context Suggester 的步骤:

  1. 定义一个 Mapping
  2. 索引数据,并且为每个文档加入 Context 信息
  3. 查询

示例:

# 设置 Mapping
PUT comments
PUT comments/_mapping
{
"properties": {
"comment_autocomplete":{ # 字段名称
"type": "completion", # 字段类型
"contexts":[{ # Context Suggester,是一个数组
"type":"category", # 上下文类型
"name":"comment_category" # 名称
}]
}
}
} # 写入数据
POST comments/_doc
{
"comment":"I love the star war movies",
"comment_autocomplete":{
"input":["star wars"], # 如果请求 movies 类型的数据,就返回 "star wars"
"contexts":{
"comment_category":"movies" # 自定义 movies 类型
}
}
} POST comments/_doc
{
"comment":"Where can I find a Starbucks",
"comment_autocomplete":{
"input":["starbucks"], # 如果请求 coffee 类型的数据,就返回 "starbucks"
"contexts":{
"comment_category":"coffee" # 自定义 coffee 类型
}
}
}
} # 查询
POST comments/_search
{
"suggest": {
"MY_SUGGESTION": { # 自定义名称
"prefix": "sta", # 搜索字符串前缀
"completion":{ # 自动补全,固定写法
"field":"comment_autocomplete", # 字段名称
"contexts":{
"comment_category":"coffee" # 请求 coffee 类型的数据
}
}
}
}
}

2.5,几种建议的指标比较

比较:

  • 精准度: Completion > Phrase > Term
  • 召回率:Term > Phrase > Completion
  • 性能:Completion > Phrase > Term

(本节完。)


推荐阅读:

ElasticSearch 查询

ElasticSearch URI 查询

ElasticSearch DSL 查询

ElasticSearch 文档及操作

ElasticSearch 分词器


欢迎关注作者公众号,获取更多技术干货。

ElasticSearch 搜索模板与建议的更多相关文章

  1. Elasticsearch搜索资料汇总

    Elasticsearch 简介 Elasticsearch(ES)是一个基于Lucene 构建的开源分布式搜索分析引擎,可以近实时的索引.检索数据.具备高可靠.易使用.社区活跃等特点,在全文检索.日 ...

  2. ElasticStack学习(六):ElasticSearch搜索初探

    一.ElasticSearch搜索介绍 1.ElasticSearch搜索方式主要分为以下两种: 1).URI Search:此种查询主要是使用Http的Get方法,在URL中使用查询参数进行查询: ...

  3. Elasticsearch搜索调优权威指南 (2/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/AAkVdzmkgdBisuQZldsnvg 英文原文:https://qbox.io/blog/el ...

  4. Elasticsearch搜索调优权威指南 (1/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/qwkZKLb_ghmlwrqMkqlb7Q英文原文:https://qbox.io/blog/ela ...

  5. 看完这篇还不会 Elasticsearch 搜索,那我就哭了!

    本文主要介绍 ElasticSearch 搜索相关的知识,首先会介绍下 URI Search 和 Request Body Search,同时也会学习什么是搜索的相关性,如何衡量相关性. Search ...

  6. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

  7. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  8. Elasticsearch搜索结果返回不一致问题

    一.背景 这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题.那么为什么会出现这样的问题? 后来通过百度和google,发现这是因为 ...

  9. kotlin + springboot启用elasticsearch搜索

    参考自: http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p=78908 工具版本: elasticsearch ...

随机推荐

  1. f5添加多个vlan的方法

    1.方法一 方法二: F5不更改配置,核心添加路由 ip route 10.160.101.0 255.255.255.0 10.160.100.10

  2. 使用timeout-decorator为python函数任务设置超时时间

    需求背景 在python代码的实现中,假如我们有一个需要执行时间跨度非常大的for循环,如果在中间的某处我们需要定时停止这个函数,而不停止整个程序.那么初步的就可以想到两种方案:第一种方案是我们先预估 ...

  3. Java反射应用--2

    Java反射开窍第一篇 明天再写

  4. 2019牛客暑期多校训练营(第十场)E-Hilbert Sort(分形)

    >传送门< 题意 现给出你 $n $个坐标和 $k$,让你根据$ k$阶 希尔伯特曲线的走向排列给出的 $n $个坐标 希尔伯特曲线如下:  $k=1$ $k=2$ $k=3$可以将边长为 ...

  5. Color Changing Sofa Gym - 101962B、Renan and Cirque du Soleil Gym - 101962C、Hat-Xor Gym - 101962E 、Rei do Cangaço Gym - 101962K 、Sorting Machine Gym - 101962M

    Color Changing Sofa Gym - 101962B 题意:给你一个由字母构成的字符串a,再给你一个由0.1构成的字符串b.你需要在a字符串中找到一个可以放下b的位置,要保证b字符串中0 ...

  6. Pokémon Army (easy version) CodeForces - 1420C1 dp

    题意: 给你一个长度为n个序列v,你需要从中找一个子序列.这个子序列的值等于:子序列中奇数下标的值-偶数下标的值 你需要使得这个值尽可能大,让你输出这个最大值 题解: dp[i][0]表示:在原序列从 ...

  7. Berry Jam (前缀和)cf教育场

    距离上一篇博客又2个月了 寻思着该除除草了 教育场是真的好难 可能是因为我还是只菜鸡 哭唧唧 先说下题意:有2*n罐果酱,草莓和蓝莓,梯子在中间从梯子那开始往两边吃(可以一会左一会右),问最少吃多少果 ...

  8. POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积

    题意:在一个平面直角坐标系,一个点总是从原点出发,但是每次移动只能移动8个方向的中的一个并且每次移动距离只有1和√2这两种情况,最后一定会回到原点(以字母5结束),请你计算这个点所画出图形的面积 题解 ...

  9. Codeforces Round #531 (Div. 3) D. Balanced Ternary String (贪心)

    题意:给你一个长度为\(3*n\)的字符串,要求修改最少的次数,使得字符串中\(0,1,2\)的个数相同,并且在最少次数的情况下使字典序最小. 题解:贪心,\(0\)一定放在前面,\(1\)和\(2\ ...

  10. windows下进程间通信方法

    摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求.编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的.Microsof ...