ElasticSearch分词器和相关性详解

news2024/11/25 22:41:09

目录

ES分词器详解

基本概念

分词发生时期

分词器的组成

切词器:Tokenizer

词项过滤器:Token Filter

停用词

同义词

字符过滤器:Character Filter

HTML 标签过滤器:HTML Strip Character Filter

字符映射过滤器:Mapping Character Filter

正则替换过滤器:Pattern Replace Character Filter

相关性详解

什么是相关性(Relevance)

相关性算法

TF-IDF

BM25

通过Explain API查看TF-IDF

Boosting Query


ES分词器详解

基本概念

       分词器官方称之为文本分析器,顾名思义,是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。


分词发生时期

分词器的处理过程发生在 Index Time 和 Search Time 两个时期。

Index Time:文档写入并创建倒排索引时期,其分词逻辑取决于映射参数analyzer。

Search Time:搜索发生时期,其分词仅对搜索词产生作用。


分词器的组成

切词器(Tokenizer):用于定义切词(分词)逻辑。

词项过滤器(Token Filter):用于对分词之后的单个词项的处理逻辑。

字符过滤器(Character Filter):用于处理单个字符。

注意:分词器不会对源数据造成任何影响,分词仅仅是对倒排索引或者搜索词的行为。

切词器:Tokenizer

        tokenizer 是分词器的核心组成部分之一,其主要作用是分词,或称之为切词。主要用来对原始文本进行细粒度拆分。拆分之后的每一个部分称之为一个 Term,或称之为一个词项。可以把切词器理解为预定义的切词规则。官方内置了很多种切词器,默认的切词器位 standard。

词项过滤器:Token Filter

       词项过滤器用来处理切词完成之后的词项,例如把大小写转换,删除停用词或同义词处理等。官方同样预置了很多词项过滤器,基本可以满足日常开发的需要。当然也是支持第三方也自行开发的。

GET _analyze
 {
 "filter" : ["lowercase"],
 "text" : "WWW ELASTIC ORG CN"
 }

 GET _analyze
 {
 "tokenizer" : "standard",
 "filter" : ["uppercase"],
 "text" : ["www.elastic.org.cn","www elastic org cn"]
 }

停用词
在切词完成之后,会被干掉词项,即停用词。停用词可以自定义
英文停用词(english):a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on,
or, such, that, the, their, then, there, these, they, this, to, was, will, with。
中日韩停用词(cjk):a, and, are, as, at, be, but, by, for, if, in, into, is, it, no, not, of, on, or, s,
such, t, that, the, their, then, there, these, they, this, to, was, will, with, www。
DELETE test_token_filter_stop
PUT test_token_filter_stop
{
  "settings": {
    "analysis": {
      "filter": {
        "my_filter": {
          "type": "stop",
          "stopwords": [
            "www"
          ],
          "ignore_case": true
        }
      }
    }
  }
}
GET test_token_filter_stop/_analyze
{
  "tokenizer": "standard",
  "filter": [
    "my_filter"
  ],
  "text": [
    "What www WWW are you doing"
  ]
}

同义词

同义词定义规则

a, b, c => d:这种方式,a、b、c 会被 d 代替。

a, b, c, d:这种方式下,a、b、c、d 是等价的。

PUT test_token_filter_synonym
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonym": {
          "type": "synonym",
          "synonyms": [ "good, nice => excellent" ] //good, nice, excellent
        }
      }
    }
  }
}
GET test_token_filter_synonym/_analyze
{
  "tokenizer": "standard", 
  "filter": ["my_synonym"], 
  "text": ["good"]
}

字符过滤器:Character Filter

分词之前的预处理,过滤无用字符。

PUT <index_name>
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "<char_filter_type>"
        }
      }
    }
  }
}

type:使用的字符过滤器类型名称,可配置以下值:

html_strip、mapping、pattern_replace

HTML 标签过滤器:HTML Strip Character Filter

字符过滤器会去除 HTML 标签和转义 HTML 元素,如、&

PUT test_html_strip_filter
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "html_strip",  // html_strip 代表使用 HTML 标签过滤器
          "escaped_tags": [     // 当前仅保留 a 标签        
            "a"
          ]
        }
      }
    }
  }
}
GET test_html_strip_filter/_analyze
{
  "tokenizer": "standard", 
  "char_filter": ["my_char_filter"],
  "text": ["<p>I&apos;m so <a>happy</a>!</p>"]
}

参数:escaped_tags:需要保留的 html 标签。

字符映射过滤器:Mapping Character Filter

通过定义映替换为规则,把特定字符替换为指定字符

PUT test_html_strip_filter
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "mapping",    // mapping 代表使用字符映射过滤器
          "mappings": [                // 数组中规定的字符会被等价替换为 => 指定的字符
            "滚 => *",
            "垃 => *",
            "圾 => *"
          ]
        }
      }
    }
  }
}
GET test_html_strip_filter/_analyze
{
  //"tokenizer": "standard", 
  "char_filter": ["my_char_filter"],
  "text": "你就是个垃圾!滚"
}
正则替换过滤器:Pattern Replace Character Filter
PUT text_pattern_replace_filter
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",    // pattern_replace 代表使用正则替换过滤器            
          "pattern": """(\d{3})\d{4}(\d{4})""",    // 正则表达式
          "replacement": "$1****$2"
        }
      }
    }
  }
}
GET text_pattern_replace_filter/_analyze
{
  "char_filter": ["my_char_filter"],
  "text": "您的手机号是18868686688"
}

相关性详解

搜索是用户和搜索引擎的对话,用户关心的是搜索结果的相关性

1. 是否可以找到所有相关的内容

2. 有多少不相关的内容被返回了

3. 文档的打分是否合理

4. 结合业务需求,平衡结果排名


什么是相关性(Relevance)

       搜索的相关性算分,描述了一个文档和查询语句匹配的程度。ES 会对每个匹配查询条件的结果进行算分_score。打分的本质是排序,需要把最符合用户需求的文档排在前面。

如何衡量相关性:

1. Precision(查准率)―尽可能返回较少的无关文档。

2. Recall(查全率)–尽量返回较多的相关文档。

3. Ranking -是否能够按照相关度进行排序。


相关性算法

ES5之前,默认的相关性算分采用TF-IDF,现在采用BM25。

TF-IDF

       TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。

Lucene中的TF-IDF评分公式:

TF是词频(Term Frequency)

检索词在文档中出现的频率越高,相关性也越高。

词频(TF) = 某个词在文档中出现的次数 / 文档的总词数

IDF是逆向文本频率(Inverse Document Frequency)

每个检索词在索引中出现的频率,频率越高,相关性越低。总文档中有些词比如“是”、“的” 、“在” 在所有文档中出现频率都很高,并不重要,可以减少多个文档中都频繁出现的词的权重。

逆向文本频率(IDF)= log (语料库的文档总数 / (包含该词的文档数+1))

字段长度归一值( field-length norm)

检索词出现在一个内容短的 title 要比同样的词出现在一个内容长的 content 字段权重更大。

       以上三个因素——词频(term frequency)、逆向文本频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的,最后将它们结合在一起计算单个词在特定文档中的权重。

BM25

       BM25 就是对 TF-IDF 算法的改进,对于 TF-IDF 算法,TF(t) 部分的值越大,整个公式返回的值就会越大。BM25 就针对这点进行来优化,随着TF(t) 的逐步加大,该算法的返回值会趋于一个数值。

        从ES5开始,默认算法改为BM25,和经典的TF-IDF相比,当TF无限增加时,BM25算分会趋于一个数值。

               

BM25公式


通过Explain API查看TF-IDF
PUT /test_score/_bulk
{"index":{"_id":1}}
{"content":"we use Elasticsearch to power the search"}
{"index":{"_id":2}}
{"content":"we like elasticsearch"}
{"index":{"_id":3}}
{"content":"Thre scoring of documents is caculated by the scoring formula"}
{"index":{"_id":4}}
{"content":"you know,for search"}

GET /test_score/_search
{
  "explain": true, 
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}

GET /test_score/_explain/2
{
  "query": {
    "match": {
      "content": "elasticsearch"
    }
  }
}
Boosting Query

Boosting是控制相关度的一种手段。可以通过指定字段的boost值影响查询结果

参数boost的含义:

1. 当boost > 1时,打分的权重相对性提升

2. 当0 < boost

3. 当boost

应用场景:希望包含了某项内容的结果不是不出现,而是排序靠后。

POST /blogs/_bulk
{"index":{"_id":1}}
{"title":"Apple iPad","content":"Apple iPad,Apple iPad"}
{"index":{"_id":2}}
{"title":"Apple iPad,Apple iPad","content":"Apple iPad"}

GET /blogs/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "apple,ipad",
              "boost": 1
            }
          }
        },
        {
          "match": {
            "content": {
              "query": "apple,ipad",
              "boost": 4
            }
          }
        }
      ]
    }
  }
}

案例:要求苹果公司的产品信息优先展示

POST /news/_bulk
{"index":{"_id":1}}
{"content":"Apple Mac"}
{"index":{"_id":2}}
{"content":"Apple iPad"}
{"index":{"_id":3}}
{"content":"Apple employee like Apple Pie and Apple Juice"}

GET /news/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "content": "apple"
        }
      }
    }
  }
}

利用must not排除不是苹果公司产品的文档

GET /news/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "content": "apple"
        }
      },
      "must_not": {
        "match":{
          "content": "pie"
        }
      }
    }
  }
}

利用negative_boost降低相关性

对某些返回结果不满意,但又不想排除掉( must_not),可以考虑boosting query的negative_boost。

1. negative_boost 对 negative部分query生效。

2. 计算评分时,boosting部分评分不修改,negative部分query乘以negative_boost值。

3. negative_boost取值:0-1.0,举例:0.3。

GET /news/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "content": "apple"
        }
      },
      "negative": {
        "match": {
          "content": "pie"
        }
      },
      "negative_boost": 0.2
    }
  }
}

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

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

相关文章

【Linux技术宝典】深入理解Linux基本指令:命令行新手指南

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅Linux技术宝典 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、Linux下基本指令1. ls 指令2. pwd指令3. clear指令4. cd指令什么是家目录&#xf…

2023全球云计算市场份额排名

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近Synergy研究院发布了最新的全球云计算市场份额排名。 亚马逊依旧是以31%的的市场份额排名第一&#xff0c;微软azure24%排名第二&#xff0c;Google云11%排名第三&#xff0c;阿里云4%排名第四。腾讯云和IBM、…

thinkphp5.0提示不支持redis,not support: redis

安装PHP扩展 例如宝塔&#xff0c;其他环境请用命令行&#xff0c;安装 redis配置完成以后&#xff0c;修改php.ini把redis扩展打开即可&#xff0c;重启环境

docker磁盘不足!已解决~

目录 &#x1f35f;1.查看docker镜像目录 &#x1f9c2;2.停止docker服务 &#x1f953;3.创建新的目录 &#x1f32d;4.迁移目录 &#x1f37f;5.编辑迁移的目录 &#x1f95e;6.重新加载docker &#x1f354;7.检擦docker新目录 &#x1f373;8.删掉旧目录 1.查看doc…

MySQL 基础知识(五)之数据增删改

目录 1 插入数据 2 删除数据 3 更改数据 创建 goods 表 drop table if exists goods; create table goods ( id int(10) primary key auto_increment, name varchar(14) unique, stockdate date )charsetutf8; 1 插入数据 当要插入的数据为日期/时间类型时&#xff0c;如果…

Mysql的安装、使用、优势与教程

一.安装 1.在小皮的设置界面检测3306端口&#xff0c;保障3306端口可用&#xff1b; 2、在小皮的首面界面&#xff0c;启动MySQL&#xff1b; 3、进行环境变量设置&#xff0c;找到MySQL的路径&#xff0c;进行复制&#xff1b; 4、在Windows的搜索栏内&#xff0c;输入“环境…

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…

【算法设计与分析】反转链表 ||

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表…

《UE5_C++多人TPS完整教程》学习笔记16 ——《P17 菜单类(The Menu Class)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P17 菜单类&#xff08;The Menu Class&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&#x…

安装Centos系统

1.镜像安装 镜像安装:Centos7安装 2.安装过程(直接以图的形式呈现) 选择你已经下载好的镜像 回车即可,等待安装 等待安装即可

MOS管开关电路实例、功耗计算

一、mos管的工作区域 mos管有三个工作区域&#xff1a; 截止区域 线性&#xff08;欧姆&#xff09;区域 饱和区域 当 VGS < VTH时&#xff0c;mos管工作在截止区域。在该区域中&#xff0c;mos管处于关断状态&#xff0c;因为在漏极和源极之间没有感应沟道。 对于要感…

【Linux】环境变量及相关指令

一、环境变量的基本概念 其实&#xff0c;我们早就听说过环境变量&#xff0c;比如在学习 JAVA / Python 的时候&#xff0c;会在 Windows 上配置环境变量&#xff1a; 环境变量到底是什么呢&#xff1f; 环境变量&#xff08;environment variables&#xff09;一般是指在操作…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇&#x1f600; &#xff08;祝广大IT学习者、工作者0 error 0 warning&#xff01;&#xff09; DDL英文全称是Data Definition Language&#xff08;数据定义语言&#xff09;&#xff0c;用来定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象 …

毕业设计vue+php幼儿园网站系统yl567

幼儿园网站系统。采用vscode集成IDE对幼儿园网站系统统进行开发,整合系统的各个模块。 拟开发的幼儿园网站系统通过测试,确保在最大负载的情况下稳定运转,各个模块工作正常,具有较高的可用性。系统整体界面简洁美观,用户使用简单,满足用户需要。在因特网发展迅猛的当今社会,幼儿…

Spring Boot 笔记 021 项目部署

1.1 引入坐标&#xff0c;并双击package打包成jar包 1.2 在服务器上运行jar包 1.3 使用postman测试 2.1 运行配置 2.1.1 命令更改端口 java -jar big-event-1.0-SNAPSHOT.jar --server.port7777 2.1.2 环境变量更新&#xff08;略&#xff09; 2.1.3 外部配置文件&#xff0c…

Excel练习:日历

Excel练习&#xff1a;日历 ‍ 题目&#xff1a;制作日历 ‍ ​​ 用rows和columns函数计算日期单元格偏移量 一个公式填充所有日期单元格 ​​ ‍

爬爬爬——qq模拟登录,古诗文网模拟登录并爬取内容(cookie)

cookie——可以理解为&#xff0c;记录为登录状态。如果在登录一个网站之后&#xff0c;想拿到信息发现404了&#xff0c;就是没有加cookie在这个header里。 下图加了cookie和没有加的对比&#xff08;我是用了selenuim自动化登录的&#xff09;&#xff1a; 下面是加了的 这个…

数据分析案例-基于亚马逊智能产品评论的探索性数据分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

FreeRTOS 调度算法简述

优先级抢占式调度 本章的示例程序已经演示了 FreeRTOS 在什么时候以及以什么方式选择一个什么 样的任务来执行。  每个任务都赋予了一个优先级。  每个任务都可以存在于一个或多个状态。  在任何时候都只有一个任务可以处于运行状态。  调度器总是在所有处于就…

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…