白话Elasticsearch22- 深度探秘搜索技术之match_phrase_prefix实现search-time搜索推荐

举报
小工匠 发表于 2021/09/11 01:31:07 2021/09/11
【摘要】 文章目录 概述match_phrase_prefix官方说明例子 总结 概述 继续跟中华石杉老师学习ES,第22篇 课程地址: https://www.roncoo.com/v...


在这里插入图片描述

概述

继续跟中华石杉老师学习ES,第22篇

课程地址: https://www.roncoo.com/view/55


match_phrase_prefix

官方说明

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase-prefix.html

在这里插入图片描述


搜索推荐,search as you type,搜索提示,解释一下什么意思

假设有这么几个doc 如下

hello world
hello we
hello win
hello wind
hello dog
hello cat

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

搜索 hello w

hello world
hello we
hello win
hello wind

  
 
  • 1
  • 2
  • 3
  • 4

会给出提示 如何上 ,搜索推荐的功能

这种效果

在这里插入图片描述


例子

造点数据

PUT /my_index1/my_type1/1
{
  "content":"hello Jack"
}


PUT /my_index1/my_type1/2
{
  "content":"hello John"
}




PUT /my_index1/my_type1/3
{
  "content":"hello Jose"
}





PUT /my_index1/my_type1/4
{
  "content":"hello Dave"
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

查询

GET /my_index1/my_type1/_search
{
  "query": {
    "match_phrase_prefix": {
      "content": "hello J"
    }
  }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

返回

{
  "took": 38,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1.7509375,
    "hits": [
      {
        "_index": "my_index1",
        "_type": "my_type1",
        "_id": "2",
        "_score": 1.7509375,
        "_source": {
          "content": "hello John"
        }
      },
      {
        "_index": "my_index1",
        "_type": "my_type1",
        "_id": "1",
        "_score": 1.1507283,
        "_source": {
          "content": "hello Jack"
        }
      },
      {
        "_index": "my_index1",
        "_type": "my_type1",
        "_id": "3",
        "_score": 1.1507283,
        "_source": {
          "content": "hello Jose"
        }
      }
    ]
  }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

总结

match_phrase_prefix原理跟match_phrase类似,唯一的区别,就是把最后一个term作为前缀去搜索

  • hello就是去进行match,搜索对应的doc
  • w,会作为前缀,去扫描整个倒排索引,找到所有w开头的doc
  • 然后找到所有doc中,即包含hello,又包含w开头的字符的doc
  • 根据你的slop去计算,看在slop范围内,能不能让hello w,正好跟doc中的hello和w开头的单词的position相匹配
  • 也可以指定slop,但是只有最后一个term会作为前缀

  • max_expansions:指定prefix最多匹配多少个term,超过这个数量就不继续匹配了,限定性能
  • 默认情况下,前缀要扫描所有的倒排索引中的term,去查找w打头的单词,但是这样性能太差。可以用max_expansions限定,w前缀最多匹配多少个term,就不再继续搜索倒排索引了。

尽量不要用,因为,最后一个前缀始终要去扫描大量的索引,性能可能会很差

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/97979399

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。