从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶

这篇具有很好参考价值的文章主要介绍了从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧!

(PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~)

从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶


一、美女的搜索条件

(上文提到,小帅看了行服小姐姐输入的搜索条件后,瞬间变成愁眉苦脸…)

小帅:“老胡,她这样搜,把我整不会了!果然,Input is evil.”
从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶

江华:“你搞笑吧,这不是很正常么,你在百度谷歌上不也是这样搜吗?”

小帅:“话是这样说,她不是要模糊搜索么,这样搜索根本匹配不到任何数据啊!她不加空格可能还能搜到一些商品。”

老胡:“有时候客户提的诉求并不严格是字面的意思,毕竟大家的理解层面不一样,行服说的模糊搜索,应该指的是带着她输入的字样的商品都能搜索到,所以你需要换一种实现方式。”

小帅:“那要怎样实现呢?老胡给点思路我参考下。”

老胡:“其实简单点可以尝试用分词检索,这里可以分成两部分。其一是建立倒排索引时,把需要检索的物料文本字段做好分词切片。其二是把搜索的关键词文本做分词切片,利用ElasticSearch提供的特性将两者做分词匹配,这样就能返回你当前需要检索的商品了。”

二、正排索引和倒排索引

我们知道ElasticSearch支持快速全文检索是因为它使用一种成为倒排索引的结构,那什么是倒排索引呢?我们先来重温一下正排索引和倒排索引的概念。

正排索引:指的是将文档按照顺序进行存储,每个文档包含了所有的字段信息,包括字段的值和位置,这样查询速度较快,但是占用的存储空间较大。简单来说就是-用主键ID来指向数据内容

倒排索引:则是将文档中的每个字段中的每个单词进行索引,每个单词都有一个指向包含该单词的文档的指针,这样查询速度较快,而且占用的存储空间较小。简单来说就是-用数据内容关键词来指向主键ID
从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶

三、分词和分词器

有了这些概念,我们能大概理解为什么ES能支持快速全文检索了,它的核心是关键词的提取。那在ES是怎样提取数据关键词的呢?这里涉及到一个重要的概念分词和分词器。

分词:是将文本按照一定的规则进行切分,得到一系列的词语。这些词语可以用来进行索引和搜索。
分词器:是一个插件,可以根据不同的需求选择不同的分词器,如英文分词器、中文分词器等。

中文的分词与英文的分词不同,因为中文没有明显的分隔符,所以需要根据词语的语法和语义进行切分。中文分词器可以使用一些现成的开源库,如IKAnalyzer、SmartChineseAnalyzer、jieba等。这些分词器可以进行中文分词,并且可以处理一些特殊情况,如人名、地名等。

这里,建立物料索引的时候我们可以使用分词器ik_max_word,使文本切割得比较细粒度且完整,query检索时候使用分词器ik_smart,减少分词数量尽量提高检索相关性。


## 测试分词器
GET _analyze
{
  "analyzer": "ik_max_word",
  "text":"1078823925183295617 测试用例店铺 8757783 8757784 aaazunTEST1"
}
GET _analyze
{
  "analyzer": "ik_smart",
  "text":"aaazunTEST1"
}

小帅:“我明白了,我这就去改一下。”

四、分词检索

(于是,小帅噼里啪啦一顿乱敲,利用reindex做数据迁移,利用elasticsearch分词能力,搜索系统2.1 elasticsearch分词版本出来了)

主要技能点

1、建立新索引skus_v2,主要用来更换mapping,使用分词器重建索引。PS:这里设置refresh时间为30s目的是加速迁移,大索引怎样迁移可以留言咨询,这里不一一展开。

PUT skus_v2
{
  "settings": {
    "refresh_interval": "30s",
    "number_of_replicas": 1,
    "number_of_shards": 5
  },
  "mappings": {
    "_doc": {
      "dynamic": "false",
      "_all": {
        "enabled": false
      },
      "dynamic_templates": [],
      "properties": {
        "skuNameChinese": {  ## 篇幅有限,其它略写如productSkuId,productSpuId均为keyword类型
          "type": "text",
          "fields": {
            "raw": {
              "type": "keyword"
            }
          },
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_smart"
        }
      }
    }
  }
}

2、利用elasticsearch的reindex功能,从旧索引skus_v1迁移数据到新索引skus_v2。

## size 表示每批次迁移多少条数据
## query 表示只迁移有效的数据
## "conflicts": "proceed" 表示不中断冲突
## "op_type": "create" 表示只向目标索引插入新数据
## external表示保留最新的 version 对应的数据
## slices 表示多少个分片并行迁移
## wait_for_completion=false表示异步,防止超时
POST _reindex?wait_for_completion=false&slices=5
{
  "source": {
    "index": "skus_v1",
    "size": 10000,
    "query": {
      "bool": {
        "must": [
          {
            "term": {
              "delFlag": {
                "value": 0,
                "boost": 1
              }
            }
          }
        ]
      }
    }
  },
  "dest": {
    "index": "skus_v2",
    "version_type": "external"
  },
  "conflicts": "proceed"
}

3、利用elasticsearch的别名alias功能,指向新索引skus_v2,做在线替换。

POST /_aliases
{
  "actions": [
    {
      "remove": {
        "index": "skus_v1",
        "alias": "skus"
      }
    },
    {
      "add": {
        "index": "skus_v2",
        "alias": "skus"
      }
    }
  ]
}

4、例如搜索水杯的语句可以改写为这样。

GET skus/_search
{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "delFlag": {
              "value": 0,
              "boost": 1
            }
          }
        },
        {
          "match": {
            "searchTag": {
              "query": "水杯",
              "operator": "AND",
              "prefix_length": 0,
              "max_expansions": 50,
              "fuzzy_transpositions": true,
              "lenient": false,
              "zero_terms_query": "NONE",
              "auto_generate_synonyms_phrase_query": true,
              "boost": 1
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "_source": false,
  "sort": [
    {
      "id": {
        "order": "desc"
      }
    }
  ],
  "collapse": {
    "field": "productSpuId",
    "inner_hits": {
      "name": "productSpuId",
      "ignore_unmapped": true,
      "from": 0,
      "size": 0,
      "version": false,
      "seq_no_primary_term": false,
      "explain": false,
      "track_scores": false
    }
  }
}

未完待续…文章来源地址https://www.toymoban.com/news/detail-442817.html

到了这里,关于从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Netty》从零开始学netty源码(五十一)之PoolArena的内存释放与扩容

    当chunk使用完毕后需要释放,如果是池化chunk则需要放回池中供下次循环利用,如果是非池化的则直接释放对应的物理空间。 下面继续分析释放具体物理空间的destroyChunk()方法和释放chunk的freeChunk()方法。 destroyChunk() 该方法为抽象方法,由具体实现类实现,以DirectArena为例 fre

    2024年02月02日
    浏览(40)
  • React--》从零开始搭建一个文章后台管理系统

    目录 项目准备 项目搭建 scss预处理器的使用 配置基础路由 组件库antd的使用 开发者工具的安装 登录模块 基本样式搭建 创建表单结构 获取表单数据并进行相关登录操作 对登录模块的token进行相关处理 路由鉴权实现 后台页面模块 基本页面结构搭建 菜单高亮显示 展示个人信

    2023年04月17日
    浏览(49)
  • linux系统从零开始搭建CICD jenkins环境

    本文教你从零开始搭建jenkins环境,开始你的CICD之旅。 1.1 系统与安装环境 本文的环境为云服务器环境,系统为linux Red-hat系统。版本信息如下: Linux version 3.10.0-1160.88.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP 如果是linux其它系统,也

    2024年02月04日
    浏览(55)
  • 从零开始搭建后端信息管理系统(新手小白比如)

    如果你是新手小白,首先我们要进行一些准备工作,安装一些基础软件, 备注一下:这里安装的vue环境的后台管理系统,不同的后台管理系统,需要安装不同的插件 准备工作: 安装 Visual Studio Code nodejs 配置插件    首先安装开发环境Visual Studio Code 打开官网:下载 Visual Stu

    2024年04月11日
    浏览(61)
  • 教你从零开始搭建双系统——Linux(Manjaro)和Win双系统

    苦于不知如何搭建双系统?带你不踩坑,快速上手安装双系统,准备~上车!!! 目录 前期准备: 正式开始: 启动现有系统,将 U 盘插入电脑(再次提醒最好是 64G 的 U 盘) 安装 ventoy 到 U 盘 出现问题  报错 U 盘找不到了 解决报错 U 盘分区 下载 Win 和 Manjaro 的ISO镜像文件 WI

    2024年02月19日
    浏览(64)
  • 从零开始搭建企业管理系统(三):集成 Spring Data Jpa

    JPA(Java Persistence API)是 Java 标准中的一套 ORM 规范(提供了一些编程的 API 接口,具体实现由 ORM 厂商实现,如Hiernate、TopLink 、Eclipselink等都是 JPA 的具体实现),借助 JPA 技术可以通过注解或者 XML 描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中(即

    2024年02月04日
    浏览(53)
  • 【从零开始学习JAVA | 第三十三篇】File类

    目录 前言: File类: 构造方法: 常见成员方法: 总结:         本文我们将为大家介绍JAVA中一个比较使用的类:File类,他为我们提供了存储数据的功能,使得程序的数据不至于在运行结束之后就丢失,是一个很好的类。         File类是Java标准库中用于操作文件和目录

    2024年02月15日
    浏览(57)
  • 【从零开始学习JAVA | 第二十三篇】集合体系结构

    目录 前言: 单列集合:      set与list的区别: 双列集合: map的特点: 总结:                   JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这

    2024年02月16日
    浏览(59)
  • ELKF日志系统搭建部署教程:从零开始构建Elasticsearch + Logstash + Filebeat + Kibana

    学习如何从头开始搭建和部署ELKF日志系统,利用Elasticsearch、Logstash、Filebeat和Kibana来实现高效的数据采集、处理和可视化展示。跟随本教程,轻松构建稳定的日志系统。

    2024年02月05日
    浏览(52)
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset

    该篇文章已经被专栏《从零开始学k8s》收录 上一篇文章:kubernetes持久化存储下 点击跳转 StatefulSet 是为了管理有状态服务的问题而设计的 对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包