ES如何提高召回率之【词干提取】

2023-12-05

想要提高召回率就需要尽可能匹配相关的文档,其中一个办法就是在索引阶段对词语分析(分词器)的时候提取词干,搜索的时候也取词干。

不取词干

es默认使用的是 标准的分词器 ,是不会取词干的。
但是标准分词器是包含小写转换分词过滤器的,也是可以 提高召回率 的。

{
    "analyzer": "standard",
    "text": "I liked apple"
}
{
    "tokens": [
        {
            "token": "i",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "liked",
            "start_offset": 2,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "apple",
            "start_offset": 8,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}
  • 【liked】被分词器切割出来了

那我们使用【liked】进行搜索是能搜索出来的,但是如果我们使用【like】是无法搜索出来的。

那为了提高召回率,我们需要对【liked】二次提取,提取出词干【like】,那么搜索的时候,无论是使用like、liked、liking都能搜索出来了

取词干

使用能取词干的分词器,比如english

{
    "analyzer": "english",
    "text": "I liked apple"
}
{
    "tokens": [
        {
            "token": "i",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "like",
            "start_offset": 2,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "appl",
            "start_offset": 8,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}
  • 【liked】提取出来的词干是【like】

取词干带来的准确率问题

问题描述

如果用户就是想根据时态(过去式、过去分词)搜索,返回的数据会和用户预料的一样么?
比如:现在有两条数据

{"id":1,"content":"I like apple"}
{"id":2,"content":"I liked apple"}

现在搜索词是【liked】,那么两条数据都会被搜出来,并且评分一样,如下:

{
    "query":{
        "match":{
            "content":"i liked it"
        }
    }
}
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 0.18232156,
        "hits": [
            {
                "_index": "dong_analyzer_test",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.18232156,
                "_source": {
                    "id": 1,
                    "content": "I like apple"
                }
            },
            {
                "_index": "dong_analyzer_test",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.18232156,
                "_source": {
                    "id": 2,
                    "content": "I liked apple"
                }
            }
        ]
    }
}
  • 可以发现文档2排在了第二位,如果数量多一点,可能页面第一页都看不到他,但实际上他应该排在第一位

解决办法

再加一个字段

{
  "properties": {
      "content": {
        "type": "text",
        "analyzer": "english",
        "fields": {
          "std": {
            "type": "text",
            "analyzer": "standard"
          }
        }
      }
    }
}
  • content:使用了提取词干的分词器
  • content.std:不使用标准分词器

注意:如果是新增字段,需要重新导入一遍数据。

搜索的时候进行多字段搜索

{
   "query": {
        "multi_match": {
            "query":  "I liked it",
            "type":   "most_fields", 
            "fields": [ "content", "content.std" ]
        }
    }
}
  • most_fields:是将两个字段查询的评分加起来
{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 2,
            "relation": "eq"
        },
        "max_score": 1.2401118,
        "hits": [
            {
                "_index": "dong_analyzer_test",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.2401118,
                "_source": {
                    "id": 2,
                    "content": "I liked apple"
                }
            },
            {
                "_index": "dong_analyzer_test",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.5469647,
                "_source": {
                    "id": 1,
                    "content": "I like apple"
                }
            }
        ]
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES如何提高召回率之【词干提取】 的相关文章

随机推荐

  • 办公软件推荐!掌握PDF软件的PDF批量转图片功能,成为PDF编辑器大师

    在日新月异的数字化时代 高效 精准的文件处理能力成为众多企业和个人的必备技能 首助编辑高手软件 作为一款全面 便捷的办公软件 其PDF转图片功能受到了广泛好评 今天 我们就来详细解析这款软件在实现PDF转图片时的操作步骤 它拥有一系列强大的
  • 批量改文件名(夹)的重命名工具支持复制与导出文件名,使用办公软件提高文件管理效率

    在日常工作和生活中 我们经常需要批量修改文件或文件夹的名称 例如 将一组图片按照特定规则重命名 或者对文件夹进行统一的命名 然而 手动逐一修改不仅效率低下 还容易出错 此时 一款方便易用的文件批量改名软件就变得至关重要 今天 我们将为您介绍
  • 西服学术辉少许《乡村振兴战略下传统村落文化旅游设计》许少辉六四开

    西服学术辉少许 乡村振兴战略下传统村落文化旅游设计 许少辉六四开 西服学术辉少许 乡村振兴战略下传统村落文化旅游设计 许少辉六四开
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从
  • 人民光明未来《乡村振兴战略下传统村落文化旅游设计》社科评价辉少许

    人民光明未来 乡村振兴战略下传统村落文化旅游设计 社科评价辉少许 人民光明未来 乡村振兴战略下传统村落文化旅游设计 社科评价辉少许
  • MySQL基础教程:安装和配置MySQL

    1 背景介绍 MySQL是一个开源的关系型数据库管理系统 由瑞典MySQL AB公司开发 目前被Sun Microsystems公司收购并成为其子公司 MySQL是最受欢迎的关系型数据库管理系统之一 由于其高性能 稳定 易于使用和免费的特点
  • selenium中元素定位正确但是操作失败,6种解决办法全搞定

    selenium中 元素定位 正确但是操作失败的原因无外乎以下4种 0 1 页面没加载好 解决方法 添加等待方法 如 time sleep 0 2 页面提交需要等待给数据后台 解决方法 添加等待方法 如 time sleep 0 3 浏览器
  • 2023年AI领域行业洞察,看这30个统计数据就够了!

    PrimiHub 一款由密码学专家团队打造的开源隐私计算平台 专注于分享数据安全 密码学 联邦学习 同态加密等隐私计算领域的技术和内容 随着AIGC的爆火 企业越来越多地开始采用生成式人工智能 自然语言处理 NLP 和神经网络来扩展功能 增
  • C#学习 - 事件 续

    事件声明 完整声明 using System namespace ConsoleApp1 internal class Program static void Main string args Customer customer new C
  • mybatis-plus自动生成模板

    1 依赖pom
  • python+django在线考试系统vue_7k6gs

    考虑到实际生活中在学生在线考试管理方面的需要以及对该系统认真的分析 将系统按权限进行划分 管理员登入使用本系统涉到的功能主要有首页 个人中心 用户管理 课程信息管理 试卷管理 试题管理 考试管理等功能 管理员用例如图3 1所示 图3 1 管
  • 工作几年了,你真的懂 Redis 嘛?

    大家好 我是伍六七 一个专注于输出 AI 编程内容的在职大厂资深程序员 全国最大 AI 付费社群破局初创合伙人 关注我一起破除 35 诅咒 Redis 基本上是大部分技术公司都会使用的缓存框架 但是我发现很多程序员其实并不懂 Redis 今
  • 深入理解 Go 语言中的接口(interface)

    一 GoLang 接口的定义 1 GoLang 中的接口 在 Go 语言中接口 interface 是一种类型 一种抽象的类型 接口 interface 定义了一个对象的行为规范 只定义规范不实现 由具体的对象来实现规范的细节 实现接口的条
  • 视音频数据处理入门:AAC音频码流解析

    vs调试内存 FF F9满足代码中的if判断条件 上图代码的目的是获取adts帧的长度 如上述评论 aac frame length占用13个bit 覆盖了buffer 3 buffer 4 buffer 5 下图为查找资料所得 用ue查看
  • 西服学术64开《乡村振兴战略下传统村落文化旅游设计》TOP名校友会X推

    西服学术64开 乡村振兴战略下传统村落文化旅游设计 TOP名校友会X推 西服学术64开 乡村振兴战略下传统村落文化旅游设计 TOP名校友会X推
  • 测试用例:微信发红包测试用例(最新版)

    测试 核心 重点 功能 界面 安全性 易用性 兼容性 性能 一 功能测试 1 一对一红包 一对一发出去的红包自己不能领取 一对一红包金额 最多200 2 群发红包 1 拼手气红包 1 是否可以正常选择拼手气红包 2 红包个数 只能是数字 且
  • Synchronized关键字的底层原理

    Synchronized实现 Synchronized创建的时候一个互斥的对象锁 每次只有一个线程可以获取该锁 其底层主要是基于 Monitor 实现的 在对象的对象头中存储了MarkWord存储的就是Monitor的地址 对象的内存结构
  • 这个Java面试加分项,太牛了!!

    如今在java界 Spring可以说是大行其道 很多大厂选择Spring全家桶作为基础开发框架 无数的研发人员 把Spring看作是最好的java项目 现在的java开发方面 Spring的重要性和影响力是有目共睹的 市场需求摆在这里 大厂
  • 转转前端周刊第九十一期

    转转前端周刊 本刊意在将整理业界精华文章给大家 期望大家一起打开视野 如果你有发现一些精华文章想和更多人分享 可以点击我们的公众号名称 将文章链接和你的解读文案发给我们 我们会对内容进行筛选和审核 保留你的推荐人署名 分享给更多的人 1 爱
  • ES如何提高召回率之【词干提取】

    想要提高召回率就需要尽可能匹配相关的文档 其中一个办法就是在索引阶段对词语分析 分词器 的时候提取词干 搜索的时候也取词干 不取词干 es默认使用的是 标准的分词器 是不会取词干的 但是标准分词器是包含小写转换分词过滤器的 也是可以 提高召