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

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

不取词干

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"}}]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpRunner自动化工具之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

【STM32】STM32学习笔记-STM32简介(02)

00. 目录 文章目录 00. 目录01. STM32简介1.1 STM32是什么1.2 STM32应用领域1.3 STM32命名规则1.4 STM32选型 02. ARM简介2.1 ARM是什么2.2 ARM系列 03. STM32开发板3.1 MCU简介3.2 STM32开发板3.3 STM32硬件资源 04. STM32系统架构05. STM32引脚定义06. STM32启动配置07. STM3…

深入探讨Java设计模式:构建灵活而可维护的代码

深入探讨Java设计模式&#xff1a;构建灵活而可维护的代码 设计模式是在软件设计中&#xff0c;经过反复验证&#xff0c;以解决特定问题的最佳实践的经验总结。在Java中&#xff0c;设计模式是一种强大的工具&#xff0c;用于构建可扩展、灵活且易于维护的代码。本文将深入讨…

构建第一个ArkTS应用(纯HarmonyOS应用)

1. 安装开发工具 在华为开发者官方上下载HarmonyOS应用专用的开发工具&#xff0c;链接地址&#xff1a;HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 要想使用开发工具让项目跑起来&#xff0c;需要10G的磁盘空间。开发工具需要的磁盘空间为2.36G&#xff1b;SDK需…

WT2003H语音芯片系列:通过bin文件实现板载语音更新,支持宽范围音频码率

随着科技的飞速发展&#xff0c;语音芯片已经成为了许多电子产品不可或缺的一部分。在这个领域中&#xff0c;WT2003H语音芯片系列以其卓越的性能和灵活的功能而备受瞩目。这一系列芯片具备一种独特的功能&#xff0c;即可以通过bin文件在板更新语音&#xff0c;同时音频码率支…

深度学习记录--logistic回归函数的计算图

计算图用于logistic回归函数 先回顾一下单一样本的logistic回归损失函数的公式&#xff0c;公式如下&#xff1a; 将logistic函数用计算图表示出来(以两个基础量为例)&#xff0c;计算图如下&#xff1a; 前向传播已经完成&#xff0c;接下来完成后向传播 运用链式法则依次求…

The Big IAM Challenge 云安全 CTF 挑战赛

The Big IAM Challenge 云安全 CTF 挑战赛 今天&#xff0c;我们来做一下有关于云安全 的CTF 挑战赛 The Big IAM Challenge,旨在让白帽子识别和利用 IAM错误配置&#xff0c;并从现实场景中学习&#xff0c;从而更好的认识和了解IAM相关的风险。比赛包括6个场景&#xff0c;每…

LeetCode 232.用栈实现队列

题目 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回…

智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

@[toc] 智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者…

别再争国漫一哥了,真正的王者回来了!

相信很多漫迷都知道&#xff0c;《斗罗大陆》动画在播出的五年期间一直稳稳占领国漫各榜单第一的位置。现在它已经完结了大半年&#xff0c;尽管《斗破苍穹》《完美世界》等动画都在争国漫一哥&#xff0c;但排名总是上下浮动&#xff0c;没有定论。 但就在今天&#xff0c;《斗…

用GPT4.0对csdn问答社区内容进行总结的对话记录(20231203号)

问题链接&#xff1a;微信小游戏开发2D碰撞检测问题 问题内容&#xff1a; 用户在开发微信小游戏的2D项目时遇到了碰撞检测无效的问题。他们尝试使用其他的碰撞类&#xff0c;但在2D中会报错。用户怀疑微信小游戏的框架可能不支持2D碰撞检测&#xff0c;或者需要自己计算和编…

flink获取kafka的key value timestamp header

参考&#xff1a; http://t.csdnimg.cn/FvqEn

JUC-AQS

如何利用CAS实现一个同步框架 state&#xff1a;共享标记位。利用CAS修改&#xff0c;达到同步管理等待队列&#xff1a;存储需要等待获取锁的线程 共享标记位state0 表示资源是空闲的&#xff1b;state1表示有1个线程获取到资源&#xff0c;如何独占模式&#xff0c;判断持有…

一款充电桩解决方案设计

一、基本的概述 项目由IP6536提供两路5V 1.5A 的USB充电口&#xff0c;IP6505提供一路最大24W的USB快充口支持QC3.0 / DCP / QC2.0 / MTK PE1.1 / PE2.0 / FCP / SCP / AFC / SFCP的快充协议&#xff0c;电池充电由type-C输入经过IP2326输出最高15W快充对电池进行充电&#xf…

C++:异常

文章目录 传统的处理错误的方式C异常C异常的使用抛异常的举例异常的重新抛出异常规范 自定义异常体系C标准库中的异常体系异常的优缺点 本篇总结的是C中关于异常的内容 传统的处理错误的方式 在C语言中&#xff0c;对于传统的错误方式有 终止程序&#xff1a;例如assert&…

上海市计算机学会竞赛2023年11月月赛丙组

1.刷题 #include<iostream> using namespace std; int main(){int n,m,a;cin>>n>>m;if(n%m!0){an/m1;}if(n%m0){an/m;}cout<<a; } 2.染色 #include<iostream> #include<algorithm> using namespace std; long long a[300010]; int main…

【STL】手撕 string类

目录 1&#xff0c;string类框架 2&#xff0c;string&#xff08;构造&#xff09; 3&#xff0c;~string&#xff08;析构&#xff09; 4&#xff0c;swap&#xff08;交换&#xff09; 5&#xff0c;string&#xff08;拷贝构造&#xff09; 1&#xff0c;常规法 2&a…

pythonanywhere 介绍

最近因为工作需要用到类似Azure Function App的服务&#xff0c;不过Azure Function App服务需要购买Azure VM&#xff0c;不是免费的。在stackoverflow上刚好看到有人提到pythonanywhere提供类似Azure Function App的服务&#xff0c;而且可以免费使用三个月。 首先申请一个免…

Cmkae外部依赖管理

文章目录 一、cmake依赖管理介绍二、源码依管理1. FetchContent与find_package进行集成 2. CPM3. git submodule附加&#xff1a; address_sanitizer 和 undefined sanitizer 一、cmake依赖管理介绍 CMake 是跨平台的构建系统&#xff0c;支持 C/C、Objective-C、Fortran 等多种…

Git Bash环境下用perl脚本获取uuid值

在Linux环境下&#xff0c;比如在ubuntu就直接有uuidgen命令直接获取uuid值。在Windows环境下常用的git bash中没有对应的命令&#xff0c;略有不便。这里用脚本写一个uuidgen&#xff0c;模拟Linux环境下的uuidgen命令。 #! /usr/bin/perl use v5.14; use Win32;sub uuidGen {…