ElasticSearchDSL

server/2024/10/21 9:23:57/

ElasticSearchDSL

      • DSL Query的分类
      • DSL Query基本语法
        • 全文检索查询:
        • 精确查询
        • 地理查询
        • 复合查询
      • elasticsearch中的相关性打分算法是什么?
      • Function Score Query
      • 复合查询 Boolean Query
      • 排序
      • 分页

DSL Query的分类

  • 查询所有:查询出所有数据,一般测试用。match_all
  • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中进行匹配。例如:
    • match_query
    • multi_match_query
  • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如
    • ids
    • range
    • term
  • 地理(geo)查询:根据经纬度查询。例如:
    • geo_distance
    • geo_bounding_box
  • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件
    • bool
    • function_score

DSL Query基本语法

查询的基本语法如下:

GET /indexName/_search
{"query":{"查询类型":{"查询条件":"条件值"}}
}
全文检索查询:

match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:

GET /indexName/_search
{"query":{"match":{"FIELD":"TEXT"}}   
}

multi_match:与match查询类似,只不过允许同时查询多个字段,语法:

GET /indexName/_search
{"query":{"multi_match":{"query":"TEXT","fields":["FIELD1" , "FIELD2"]}}   
}

match和multi_match的区别:

  • match:根据一个字段查询
  • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词

term查询:

GET /indexName/_search
{"query":{"term":{"FIELD":{"value":"VALUE"}}}
}

range查询:

GET /idnexName/_search
{"query":{"range":{"FIELD":{"gte":10,"lte":20}}}
}
地理查询
  • geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
GET /indexName/_search
{"query":{"geo_bounding_box":{"FIELD":{"top_left":{"lat":31.1,"lon":121.5},"bottom_right":{"lat":30.9,"lon":121.7}}}}
}
  • geo_distance:查询到指定中心点小于某个距离值的所有文档
GET /indexName/_search
{"query":{"geo_distance":{"distance":"15km","FIELD":"31.21,121.5"}}
}
复合查询

复合查询:将其他的简单查询组合起来,实现更复杂的搜索逻辑,例如:

  • function score:算分函数查询,可以控制文档相关性算分,控制文档排名,例如百度竞价

elasticsearch_147">elasticsearch中的相关性打分算法是什么?

  • TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
  • BM25:在elasticsearch5.0之后,会随着次品增加而增大,但增长曲线会趋于水平

Function Score Query

使用function score query,可以修改文档的相关性算分,根据新得到的算分排序

算分函数的结果称为function score , 将来会与query score运算,得到新算分,常见的算分函数有:

  • weight:给一个常量值,作为函数结果
  • field_value_factor:用文档中的某个字段值作为函数结果
  • random_score:随机生成一个值,作为函数结果
  • script_score:自定义计算公式,公式结果作为函数结果

甲醛模式,定义functionscore与queryscore的运算方式,包括:

  • multiply:两者相乘。默认就是这个
  • replace:用function score替换query score
  • 其他:sum、avg、max、min

function score query定义的三要素是什么

  • 过滤条件:哪些文档要加分
  • 算分函数:如何计算function score
  • 加权方式:function score 与 query score如何运算

复合查询 Boolean Query

布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

布尔查询是一个或多个查询子句的组合。子查询的组合方式有:

  • must:必须匹配每个子查询,类似“与”
  • should:选择性匹配子查询,类似“或”
  • must_not:必须不匹配,不参与算分,类似“非”
  • filter:必须匹配,不参与算分

排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

分页

from+size:

  • 优点:支持随机翻页
  • 缺点:深度分页问题,默认查询上限(from+size)是10000
  • 场景:百度、京东、谷歌这样的随机翻页搜索

after search:

  • 优点:没有查询上限(单词查询的size不超过10000)
  • 缺点:只能向后逐页查询,并且搜索结果是非实时的
  • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页

scroll:

  • 优点:没有查询上限
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。

http://www.ppmy.cn/server/7684.html

相关文章

python网页篇

爬取网页动态数据通常涉及到JavaScript渲染的内容,这类数据并不是在原始HTML文档中直接提供的,而是通过AJAX请求、WebSocket通信或者其他客户端渲染技术生成的。以下是几种常见的处理方法: 方法1:使用带有JavaScript渲染功能的库 …

【ETOJ P1023】同鱼系 题解(数学+取余)

题目描述 给定一个大小为 n n n 的数组 a a a 和一个整数 k k k。 你可以执行以下操作任意次(0次也行): 选择一个下标 i i i 满足 1 ≤ i ≤ n − k 1 \leq i \leq n-k 1≤i≤n−k,然后交换 a i a_i ai​ 和 a i k a_{ik} aik​。…

【保姆级讲解下gateway基本配置】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间,所以在ArrayList任意位置插入或者删除元素时,就 需要将后续元素往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较…

低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

要优化低配置电脑上WPF DataGrid的刷新卡顿问题,可以尝试以下几种方法: 启用虚拟化技术: VirtualizingStackPanel.IsVirtualizing"True" 。 WPF DataGrid支持行虚拟化,这意味着只有当前可见的行会被加载和渲染&#xf…

OpenHarmony实战开发-Axios获取解析网络数据。

介绍 本示例介绍使用第三方库的Axios获取GBK格式的网络数据时,通过util实现GBK转换UTF-8格式。该场景多用于需要转换编码格式的应用。 效果图预览 使用说明 直接进入页面就可获取GBK格式的用户名信息并进行解码操作。 实现思路 1.使用第三方库Axios获取网络数据…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络,如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息,一般是通过…

react脚手架创建项目,配置别名(alias)

React脚手架项目使用 react-scripts 封装了webpack配置,所以我们需要通过 config-overrides 或者 eject 的方式来修改webpack配置 可以的话 ,创建项目的时候可以使用vite ,我这是老项目屎山 懒得迁移 ,但还得改呀 ## 1. 安装依…