Elasticsearch(八)搜索优化

2023-11-16

Elasticsearch: 6.4.2

1. 理解字段分析过程

一个常被问到的问题是,为什么指定的文档没有被搜索到。很多情况下,这都归因于映射的定义和分析例程的配置存在问题。针对分析过程的调试,Elasticsearch提供了专用的REST API。

GET /_analyze
{
  "analyzer": "standard",   # 可以替换成自定义的analyzer
  "text": "crime and publishment"
}
# 使用一个分词器和两个过滤器 
GET _analyze
{
  "tokenizer" : "keyword",
  "filter" : ["lowercase"],
  "char_filter" : ["html_strip"],
  "text" : "this is a <b>test</b>"
}
2. 解释查询

给出有关文档相关度得分计算的详细信息,以解释为什么会匹配成功。

# 针对特定文档的分析
GET /cars/doc/8/_explain?q=jeep
# 针对文本信息的分析
GET _analyze
{
  "tokenizer" : "standard",
  "filter" : ["snowball"],
  "text" : "detailed output",
  "explain" : true,
  "attributes" : ["keyword"] 
}
3. 用加权查询影响得分

Boost(权值):在计算得分过程中使用的附加权值,可在如下位置使用:

  • 查询:告诉搜索引擎指定的查询比其他查询更重要
  • 字段:指定文档中某些字段对用户很重要
  • 文档:某些文档很重要
3.1 在查询中使用权值

例如:

# 字段重要程度:from、to、subject
GET /emails/doc/_search
{
  "query": {
    "query_string": {
      "fields": ["from^5", "to^3", "subject"], 
      "query": "Bourne"
    }
  }
}
3.2 修改得分

constant_score

包装另一个查询子句,为每个文档返回得分等于boost值。

GET /cars/doc/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "name": "bmw jeep"
        }
      },
      "boost": 1.2
    }
  }
}

Boosting查询

Boosting查询与Bool查询中的NOT的不同:后者过滤掉满足NOT查询语句的文档,而前者仍然选择不被期望的文档,只是讲它们的得分降低。

GET /cars/doc/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match_all": {}
      },
      "negative": {
        "term": {
          "name": {
            "value": "jeep"
          }
        }
      },
      "negative_boost": 0.2
    }
  }
}

Function查询

boost参数设置每个文档的得分,然后对于满足functions参数中子查询条件的文档根据boost_mode、boost、weight计算新得分;

当存在多个function且某个文档满足多个function时该文档的得分为:先计算满足各个function后的每个得分,然后由score_mode参数计算最终等分。其中score_mode取值:multiply、sum、avg、first、max、min。

GET /cars/doc/_search
{
  "query": {
    "function_score": {
      "boost": 5,
      "max_boost": 50,
      "score_mode": "max",
      "boost_mode": "multiply",
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "match": {"name": "jeep"}
          },
          "weight": 4
        }
      ]
    }
  }
}
4. 具有相同含义的词
4.1 同义词(synonym)过滤器

基于数组定义

PUT /test_index
{
    "settings": {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "synonym" : {
                        "tokenizer" : "standard",
                        "filter" : ["my_stop", "synonym"]
                    }
                },
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "lenient": true,
                        "synonyms" : ["foo, bar => baz"]
                    }
                }
            }
        }
    }
}

基于文件定义:文件路径是相对于Elasticsearch安装目录下config目录的。

PUT /test_index
{
    "settings": {
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "synonym" : {
                        "tokenizer" : "whitespace",
                        "filter" : ["synonym"]
                    }
                },
                "filter" : {
                    "synonym" : {
                        "type" : "synonym",
                        "synonyms_path" : "analysis/synonym.txt"
                    }
                }
            }
        }
    }
}
4.2 同义词定义规则

默认使用Apache solr的同义词方案。

同义词显式定义

i-pod, i pod => ipod,
sea biscuit, sea biscit => seabiscuit

同义词等式定义

ipod, i-pod, i pod
foozball , foosball
universe , cosmos
lol, laughing out loud

扩展同义词

如果同义词过滤器中属性expand=true,则所有同义词被扩展为所有单词全部等价的形式。

ipod, i-pod, i pod => ipod, i-pod, i pod
5. 跨度查询

跨度是指在一个字段中开始和结束的词条位置。

span_term

GET /_search
{
    "query": {
        "span_term" : { "user" : "kimchy" }
    }
}

span_multi

包装一个term、range、prefix、wildcard、regexp或fuzzy查询。

GET /_search
{
    "query": {
        "span_multi":{
            "match":{
                "prefix" : { "user" :  { "value" : "ki" } }
            }
        }
    }
}

span_first

只允许返回在字段的前几个位置上匹配查询条件的文档。

# 查询在user字段前三个位置出现kimchy的文档
GET /_search
{
    "query": {
        "span_first" : {
            "match" : {
                "span_term" : { "user" : "kimchy" }
            },
            "end" : 3
        }
    }
}

span_near

可以在有多个其他跨度彼此接近时对文档进行搜索,该查询也是一个能将其他跨度查询包装起来的复合查询。

# slop:控制在跨度之间允许的词项的数量
# in_order: 限制匹配顺序;true时按照查询定义的顺序匹配文档
# 该示例查询message字段包含world everyone的文档。
GET /_search
{
    "query": {
        "span_near" : {
            "clauses" : [
                { "span_term" : { "message" : "world" } },
                { "span_term" : { "message" : "everyone" } }
            ],
            "slop" : 0,
            "in_order" : true
        }
    }
}

span_or

# 获取在message字段前两个位置处有world或者离everyone不超过一个位置处含有world的文档。
GET /_search
{
  "query": {
    "span_near": {
      "clauses": [
        {
          "span_first": {
            "match": {
              "span_term": {
                "message": {
                  "value": "world"
                }
              }
            },
            "end": 2
          }
        },
        {
          "span_near": {
            "clauses": [
              {
                "span_term": {
                  "message": {
                    "value": "world"
                  }
                }
              },
              {
                "span_term": {
                  "message": {
                    "value": "everyone"
                  }
                }
              }
            ],
            "slop": 1,
            "in_order": true
          }
        }
      ],
      "slop": 0,
      "in_order": true
    }
  }
}

span_not

include参数指定了哪个跨度查询应该被匹配;exclude参数指定了不与include部分重叠的跨度查询。

# 返回在message字段中匹配了由breaks词项构造的span_term查询的所有文档,然后再定义一个匹配了world和everyone并且最大位置间距为1的跨度,当该跨度与第一个跨度查询重叠时,排除掉所有重叠部分的文档。
GET /_search
{
  "query": {
    "span_not": {
      "include": {
        "span_term": {
          "message": {
            "value": "breaks"
          }
        }
      },
      "exclude": {
        "span_near": {
          "clauses": [
            {
              "span_term": {
                "message": {
                  "value": "world"
                }
              }
            },
            {
              "span_term": {
                "message": {
                  "value": "everyone"
                }
              }
            }
          ],
          "slop": 1
        }
      }
    }
  }
}

span_containing

查询内部有big和little两个字查询,仅返回big匹配的结果中包含little匹配结果的文档;从大到小包含

GET /_search
{
    "query": {
        "span_containing" : {
            "little" : {
                "span_term" : { "field1" : "foo" }
            },
            "big" : {
                "span_near" : {
                    "clauses" : [
                        { "span_term" : { "field1" : "bar" } },
                        { "span_term" : { "field1" : "baz" } }
                    ],
                    "slop" : 5,
                    "in_order" : true
                }
            }
        }
    }
}

span_within

与span_containing类似,从小到大包含。

GET /_search
{
    "query": {
        "span_within" : {
            "little" : {
                "span_term" : { "field1" : "foo" }
            },
            "big" : {
                "span_near" : {
                    "clauses" : [
                        { "span_term" : { "field1" : "bar" } },
                        { "span_term" : { "field1" : "baz" } }
                    ],
                    "slop" : 5,
                    "in_order" : true
                }
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch(八)搜索优化 的相关文章

随机推荐

  • React v4官方推荐的富文本编辑器braft-editor使用

    官方推荐使用两个编辑器其中一个 v5推荐另一个 以v4这个为例 由于官方文档都是class类组件 使用时不太方便 所以下面是自己写的一个hook函数组件 只实现了基本使用 特殊化的暂未写出 一 安装 使用npm安装 npm install
  • 解决element-plus提示组件样式丢失问题

    使用element plus的提示组件时样式不显示 import ElNotification from element plus ElNotification message err response data msg 请求失败 type
  • ObjectARX中使用非模态对话框的问题(写数据库导致AutoCAD异常问题、刷新显示)

    ObjectARX中使用非模态对话框遇到的两个问题及解决办法 一 写数据库导致AutoCAD异常问题 默认状态下AutoCAD2004是多文档应用程序 系统变量SDI 0 acdbHostApplicationServices gt wor
  • 为什么C++编译器不能支持对模板的分离式编译

    为什么C 编译器不能支持对模板的分离式编译 刘未鹏 pongba C 的罗浮宫 http blog csdn net pongba 首先 一个编译单元 translation unit 是指一个 cpp文件以及它所 include的所有 h
  • 倒序打印一个单链表

    public class SingleLinkList private static LinkListNode root public static LinkListNode initSingleLinkList LinkListNode
  • ionic 修改组件默认样式_Angular/Ionic 修改 ShadowRoot 元素样式

    在使用Ionic的时候 难免会出现要修改原有样式的情况 但新版的Ionic采用了ShadowRoot来隔离样式 不能愉快的直接通过CSS修改ShadowRoot下的样式 但我们又想修改 怎么办呢 方法一 使用 CSS3 part伪元素 但该
  • 单片机开发,主函数没调用任何程序,串口一直收到00 0 FF之类的数据

    本人是单片机小白 记录一些开发过程中的发现和心得 最近在用MSP430F1232配合射频模块 Ti的CC1101芯片 开发无线收发程序 发现向板子里灌写程序后 串口助手sscom一直收到00 0 FF之类的数据 起初以为是电平转换芯片SP3
  • numpy 笔记 extract

    用于从数组中提取满足某些条件的元素 numpy extract condition arr condition 一个布尔数组 这个布尔数组与 arr 的大小应当是一致的 arr 一个数组 从这个数组中我们会根据 condition 提取元素
  • Pytorch Mask R-CNN 实例分割

    Mask R CNN通过在 Faster RCNN 的基础上添加一个分支网络 在实现目标检测的同时 把目标像素分割出来 图像分割是深度学习和神经网络的一个重要应用 使用Pytorch自带的Mask R CNN模型 在实例分割中每个实例根据不
  • PostMan测试接口时候,如何绕过登录的验证

    之前测试的时候 需要页面进行登录之后 才能让访问后台程序 但是在进行接口测试的时候 没有验证就一直登录不进去 之后参考了一篇文章 解决如下 1 在浏览器上先登录 登录成功后获取cookie 2 接着打开postman 记住JSESSIONI
  • Python之Lock锁

    python中的锁lock threading Lock 避免多个线程保卫同一块数据的时候 产生错误 所以加锁来防止这种问题 import threading import time from queue import Queue def
  • react在不弹出eject的情况下配置sass和antd

    天气越来越热 公司的业务也慢慢放缓 这时候就有空暇时间为自己充点电了 然后就把目标放在了react上 公司的前端技术框架用的是vue 对react早就如雷贯耳 然后自己看了文档就劈里啪啦开始搞 在用create react app脚手架搭建
  • 竞赛 基于RSSI的室内wifi定位系统

    0 前言 优质竞赛项目系列 今天要分享的是 wifi室内定位系统 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 学长这里给一个题目综合评分 每项满分5分 难度系数 3分 工作量 3分 创新点 4分 更多资料 项目分享 https gi
  • new Date() 日期格式的转换

    let date new Date date getFullYear 获取年份 格式1970年 date getMonth 获取当前年的月份 月份要 1 0代表1月 date getMonth 1 date getDate 获取当前日 1
  • 手写数字识别 (tensorflow==2.4.0)

    import tensorflow as tf from tensorflow import keras fashion mnist keras datasets fashion mnist train images train label
  • 使用jQuery操作input的value值

    表单控件是jQuery的重中之重 因为一旦牵扯到数据交互 就离不开form表单的使用 比如用户的登录注册功能等 在进行操作input的value值的时候 主要使用jQuery的val 方法 点击查看val 的使用方法 看如下代码
  • CGIC文件上传----菜鸟笔记

    CGIC上传文件 一 如何利用CGIC上传自己的文件 原理 当在浏览器点击 提交 表单时候 就会上传文件内容并调用你所编写cgic程序 然后靠cgic代码保存你文件 html代码如下
  • CVPR 2021 Sequential Graph Convolutional Network for Active Learning

    深度学习在计算机视觉方面展现出非常大的进步 其代价是大规模的标注数据集 数据标注是耗时的 需要人工和雇佣成本 在许多领域 数据标注更具挑战性 如医学成像领域 此外 在优化深层神经网络架构时 数据的代表性存在差距 为了克服这些问题 主动学习已
  • HTTP协议之Libcurl

    目录 转载 https www cnblogs com xietianjiao p 13260021 html 一 libcurl简介 二 libcurl的使用 三 libcurl等第三方库的通用编译方法 四 调用libcurl编程访问百度
  • Elasticsearch(八)搜索优化

    Elasticsearch 6 4 2 1 理解字段分析过程 一个常被问到的问题是 为什么指定的文档没有被搜索到 很多情况下 这都归因于映射的定义和分析例程的配置存在问题 针对分析过程的调试 Elasticsearch提供了专用的REST