elasticsearch中highlight的“假匹配”

news/2024/7/7 5:48:35 标签: elasticsearch

elasticsearchhighlight_2">elasticsearch中highlight的“假匹配”

一个highlight的假高亮现象:

/company_meta_info/_search?rest_total_hits_as_int=true

{
  "_source": {
    "includes": ["name","address"]
  },
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address": {
              "query": "新疆蓝天七色建材有限公司",
              "operator": "and"
            }
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "name": {},
      "address": {}
    }
  },
  "from": 0,
  "size": 10
}

返回结果:可以发现通过地址是没有匹配到任何结果

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 6,
    "successful": 6,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

换一种方式:先设法把文档召回

{
  "_source": {
    "includes": ["name","address"]
  },
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "address": {
              "query": "新疆蓝天七色建材有限公司",
              "operator": "and"
            }
          }
        },
        {
          "match": {
            "org_id": "Q0000D2AC1" //此处匹配目标
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "name": {},
      "address": {}
    }
  },
  "from": 0,
  "size": 10
}

返回结果:可以发现,结果并不是由于address字段命中召回的,但是highlight却有address,so 这是为什么尼

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 6,
    "successful": 6,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 8.805375,
    "hits": [
      {
        "_index": "company_meta_info_v6",
        "_type": "_doc",
        "_id": "Q0000D2AC1",
        "_score": 8.805375,
        "_source": {
          "address": "新疆五家渠市北一东街1299号",
          "name": "新疆蓝天七色建材有限公司"
        },
        "highlight": {
          "address": [
            "<em>新疆</em>五家渠市北一东街1299号"
          ]
        }
      }
    ]
  }
}

这就需要了解elasticsearch中的高亮处理方式了。在elasticsearch中有三种高亮处理方式:highlighter, fast-vector-highlighter, postings-highlighter。默认使用的是highlighter方式。

highlighter 高亮也叫plain高亮,highlighter方式高亮是个实时分析处理高亮器。即用户在查询的时候,搜索引擎查询到了目标数据后,将需要高亮的字段数据提取到内存,再调用该字段的分析器进行处理,分析器对文本进行分析处理,分析完成后采用相似度算法计算得分最高的前n组并高亮段返回数据。

fast-vector-highlighter(fvh)高亮器利用建索引时候保存好的词项向量(term vector)来直接计算高亮段落,在高亮过程中比plain高亮方式少了实时分析过程,取而代之的是直接从磁盘中将分词结果直接读取到内存中进行计算。故要使用fvh的前置条件就是在建索引时候,需要配置存储词项向量,词向量需要包含词位置信息、词偏移量信息。

配置选项描述
no不启用term vector,默认值
yes启用term vector,但是仅仅记录分词
with_positions启用term vector, 记录分词及分词在字符串中的位置
with_offsets启用term vector, 记录分词在字符串中的起始字符位置
with_positions_offsets启用term vector, 记录分词在字符串中的位置及起始的字符位置
with_positions_payloads启用term vector, 记录分词在字符串中的位置及payloads
with_positions_offsets_payloads启用term vector, 记录分词在字符串中的位置、起始字符位置及payloads

fvh在高亮时候的逻辑如下:

1.分析高亮查询语法,提取表达式中的高亮词集合
2.从磁盘上读取该文档字段下的词向量集合
3.遍历词向量集合,提取自表达式中出现的词向量
4.根据提取到目标词向量读取词频信息,根据词频获取每个位置信息、偏移量
5.通过相似度算法获取得分较高的前n组高亮信息
6.读取字段内容(多字段用空格隔开),根据提取的词向量直接定位截取高亮字段

postings-highlighter(postings)。postings 高亮方式与fvh相似,采用词量向量的方式进行高亮,与fvh高亮不同的是postings高亮只存储了词向量的位置信息,并未存储词向量的偏移量,故中大字段存储中,postings其比fvh节省约20-30%的存储空间,速度与fvh基本相当。

so 由上述的表述我们就知道了,plain类型高亮方式,是首先召回文档,然后对文档进行高亮处理,在高亮处理的过程中并不会参考我们query中的配置条件(“operator”: “and”);所以才会出现我们上面例子中的现象。单靠address条件并不会召回目标文档;当我们用其他条件召回了目标文档时,会进行高亮处理。

我们并不能单纯的将highlight的结果当成文档的匹配原由,想要了解匹配原理还是要通过explain


http://www.niftyadmin.cn/n/5138772.html

相关文章

Python 数学函数和 math 模块指南

Python 提供了一组内置的数学函数&#xff0c;包括一个广泛的数学模块&#xff0c;可以让您对数字执行数学任务。 内置数学函数。min() 和 max() 函数可用于在可迭代对象中查找最低或最高值&#xff1a; 示例&#xff1a;查找可迭代对象中的最低或最高值&#xff1a; x min…

模拟官网编写自定义Grafana Dashboard

前言 我们想编写自定义的Dashboard&#xff0c;类似于官网那样下载的Dashboard&#xff0c;并且能移值到机器主机&#xff0c;如何实现了&#xff1f; ## 官网dashboard https://grafana.com/grafana/dashboards/ 编写 先在虚拟机写好Dashboard 然后下载。json文件如下: {…

FPGA中图像采集与网口传输流程

参考正点原子的案例&#xff0c;梳理了一下图像采集网口的流程

MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化评估

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

VS Code开发Java之快速入门

VS Code 开发Java的环境 要在VS Code中开发Java应用程序&#xff0c;需要安装以下组件&#xff1a; Java Development Kit&#xff08;JDK&#xff09;&#xff1a;JDK是Java开发的基础&#xff0c;需要下载和安装JDK。Visual Studio Code&#xff1a;VS Code是一个免费的跨平…

SpringCloud(二) Eureka注册中心的使用

在SpringCloud(一)中,我们学会了使用RestTemplate进行远程调用,但是在调用user-service时候需要在order-service中发送http请求,请求中需要书写对应微服务的ip和端口号,十分不方便,如果此时有多个user-service实例的话,就不知道调用哪个了(除非每次调用的时候都对ip和端口号进行…

【第六章作业】题解

提示&#xff1a; 下面代码仅供借鉴&#xff0c;并不是唯一正解&#xff01;有些同学的方法比我巧妙的多&#xff01; T1 统计整数个数 题目描述: 输入一个字符串&#xff0c;其包括数字和非数字字符&#xff0c;如&#xff1a;a123x456 17935? 098tab&#xff0c;将其中连…

20年残疾人经历的软件工程硕士恢复健全后开始在互联网领域创业

可能很多朋友都认识我了&#xff0c;在我 5 岁的时候&#xff0c;出了一场意外&#xff0c;当时由于家庭经济不允许还有医疗条件不允许等一些原因&#xff0c;左腿落下来残疾。 今年年后&#xff0c;在山东一家医院做了腿部手术&#xff0c;恢复了健全。 在这 20 多年的残疾人…