拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Elasticsearch 进阶

特性Low-Level REST ClientHigh-Level REST ClientJava API Client抽象层级最低直接发送JSON请求中提供对象化的API最高完全基于对象类型安全官方状态仍可用但建议迁移已弃用(Deprecated)不再推荐官方推荐(Recommended)适用版本所有版本ES 7.x 及更早版本ES 8.x 及以后版本上手难度较难需手动构建JSON简单API直观中等需理解新的函数式构建方式黑马旅游案例yfeif/hotel-demo: 黑马旅游网案例https://github.com/yfeif/hotel-demo1.索引库操作2.文档操作文档操作根据原请求也能正常处理数据但是有些解析的时候由于ES版本是8.4.1依赖是7.12.1导致空指针异常所以改写为初级的请求。3.DSL 查询文档1.DSL 查询分类 搜索引擎DSL查询的分类以Elasticsearch/OpenSearch为例在搜索领域DSL查询特指用JSON风格定义的查询语言。其查询可按结构和功能进行分类最常见的分类方式如下一、按查询结构分类这是最基础的分类方式将查询分为两大类类别描述特点常见类型叶子查询 (Leaf Query)在单个字段上查找特定值的查询是查询的最小单元。独立使用针对特定字段执行搜索。全文检索、精确查询、地理查询等。复合查询 (Compound Query)包装一个或多个叶子查询或复合查询用于组合条件或改变其行为。通过逻辑运算如布尔组合多个查询条件。bool,function_score,dis_max等。二、按查询功能分类在叶子查询内部根据功能又可以细分为以下几种查询所有最简单用于测试返回索引中的所有文档。例如match_all。全文检索查询对输入文本分词后在text类型字段中搜索。例如match单字段、multi_match多字段。精确查询对keyword、数值、日期等字段进行不分词的精确查找。例如term精确值、range范围查询。地理查询基于经纬度等地理数据进行搜索。例如geo_distance距离、geo_bounding_box矩形范围。专业查询处理特定需求的查询如span query跨度查询用于精确位置搜索、nested query嵌套查询、joining query关联查询等。 其他分类维度查询 (Query) vs 过滤 (Filter)query上下文会计算相关性得分并排序filter上下文只做筛选不计算得分性能更高常用于缓存。按数据类型查询方式需匹配字段类型例如text字段用全文检索keyword字段用精确查询。 总结简单来说对DSL查询的分类可以从三个层面理解广义概念分为外部DSL和内部DSL。结构上分为叶子查询和复合查询。功能上叶子查询可进一步分为全文检索、精确查询、地理查询等。# 查询所有 GET /hotel/_search { query: { match_all: {} } }2.全文检索查询全文检索Full-Text Search是搜索引擎和数据库中最核心的查询方式之一它不是为了进行简单的“字符串匹配”而是为了进行理解内容含义的“语义”搜索。 什么是全文检索简单来说全文检索的过程就像查字典建立索引查字典前的准备工作系统会像编写字典的“索引页”一样扫描文档中的每一个词为它们建立索引。这个索引会记录每个词出现在哪些文档、以及出现的次数和位置。这个索引结构通常被称为“倒排索引”Inverted Index。执行搜索根据索引查内容当你输入关键词查询时系统不会去原文里逐字扫描而是直接去“倒排索引”这个目录里快速查找然后返回包含这些词的文档。这种“先建目录再查目录”的方式让检索效率远高于传统的LIKE模糊匹配。⚙️ 核心原理分词与倒排索引全文检索之所以能“理解”你的搜索主要依赖两个关键技术分词Analysis在建立索引和执行搜索时系统都会用分词器Analyzer将文本切分成一个个独立的词条Term。例如“我爱北京天安门”会被切分为“我”、“爱”、“北京”、“天安门”等词条。倒排索引Inverted Index这是全文检索速度的保证。它是一个词条到文档ID的映射表能快速定位包含特定词条的所有文档。 常见查询类型以Elasticsearch为例在实际使用中最常见的全文检索查询类型如下查询类型描述适用场景match查询最基础、最核心的全文查询。会对输入进行分词然后搜索任意一个分词结果。绝大多数常规的搜索场景如电商、博客的搜索框。match_phrase查询短语匹配。不仅要求所有词出现还要求它们的顺序和位置必须一致。搜索精确的短语如“机器学习”、“中华人民共和国”。multi_match查询match查询的多字段版本。可以在多个字段如标题、内容、标签中同时搜索。不确定关键词在哪个字段需要在多个字段中综合搜索。query_string查询支持复杂的语法如布尔逻辑AND、OR、NOT、通配符等。提供给有经验的高级用户进行精确、复杂的搜索。simple_query_string查询query_string的简化、更健壮版本。对语法错误容忍度更高更适合面向普通用户。直接暴露给终端用户的搜索框避免因用户输入特殊字符导致报错。intervals查询高级匹配。可以对匹配词项的顺序和邻近度Proximity进行精细控制。法律、学术等对文本位置关系有严格要求的专业搜索。此外还有一些特定场景的变种如match_phrase_prefix常用于搜索框的自动补全Auto-complete功能。 总结全文检索 vs. 精确查询理解全文检索关键在于区分它和精确查询Term Query处理方式全文检索会对输入文本进行分词而精确查询不会它将输入作为一个整体。搜索目标全文检索搜索的是分词后的词条精确查询搜索的是未经处理的完整词条。主要用途全文检索用于相关性搜索如Google、百度精确查询用于过滤如查找特定ID、状态、精确分类等。# match查询 GET /hotel/_search { query: { match: { all: 外滩如家 } } } # multi_match查询 GET /hotel/_search { query: { multi_match: { query: 外滩如家, fields: [brand,name,business] } }3.精准查询在Elasticsearch等搜索引擎的DSL中精确查询对应的是术语级查询Term-level Query。它的核心特点是查询条件不会被分词器处理而是作为一个完整的、精确的词条Term直接去倒排索引中匹配。简单来说全文检索是“模糊理解”而精确查询是“铁面无私”的一对一比对。⚙️ 核心机制不分词 精确匹配精确查询的执行逻辑非常直白索引时文档中的字段值如果是keyword类型会作为一个完整的词条存入倒排索引。查询时你输入的搜索词不会被分词直接拿到倒排索引里查找完全相同的词条。# term查询 GET /hotel/_search { query: { term: { city: { value: 北京 } } } } # range查询 GET /hotel/_search { query: { range: { price: { gte: 900, lte: 2000 } } } } 常见精确查询类型在日常开发中最常用的精确查询主要有以下几种查询类型描述示例场景term查询最核心的精确匹配用于查找单个字段的精确值。查询状态为已完成的订单查找age等于25的用户。terms查询term的批量版匹配字段值等于给定数组中任意一个的文档。查找状态为待支付或已取消的订单。range查询查找字段值在指定数值或日期范围内的文档。查找价格在100-200之间的商品查找近7天的日志。exists查询查找包含指定字段且值不为null的文档。查找所有填写了email字段的用户。term的变体如prefix前缀匹配、wildcard通配符、regexp正则查找所有以A开头的产品编码。4.地理坐标查询核心数据类型geo_point在进行任何地理查询前索引中用于存储位置的字段类型必须是geo_point。它支持多种经纬度格式对象格式location: {lat: 41.12, lon: -71.34}数组格式location: [-71.34, 41.12]注意GeoJSON格式是经度在前纬度在后字符串格式location: 41.12,-71.34纬度在前经度在后GeoJSON格式location: {type: Point, coordinates: [-71.34, 41.12]}WKT格式location: POINT (-71.34 41.12) 主要的地理查询类型Elasticsearch提供了几种主要的地理查询方式1.geo_distance查询查找“附近”的位置用于查找距某中心点指定距离内的所有文档。例如查找(39.90, 116.65)坐标2公里内的所有位置距离单位可以是km公里或m米等# distance 查询 GET /hotel/_search { query: { geo_distance: { distance: 2km, location: 39.90,116.65 } } }2.geo_bounding_box查询查找“矩形框”内的位置用于查找落在指定矩形范围内的所有文档。需要提供矩形的左上角和右下角两个点的坐标。例如查找以下矩形框内的位置GET /my_locations/_search { query: { bool: { filter: { geo_bounding_box: { pin.location: { top_left: { lat: 40.73, lon: -74.1 }, bottom_right: { lat: 40.01, lon: -71.12 } } } } } } }5.组合查询组合查询在Elasticsearch中特指复合查询Compound Query它的核心作用是将多个独立的查询条件组合成一个整体以实现更复杂的搜索逻辑GET /hotel/_search { query: { function_score: { query: { match: { all: 北京 } }, functions: [ { filter: { term: { brand: 如家 } }, weight: 10 } ], boost_mode: sum } } }GET /hotel/_search { query: { bool: { must: [ { term: { city: 北京 } } ], should: [ { term: { brand.keyword: 7天酒店 } }, { term: { brand.keyword: 速8 } } ], must_not: [ {range: {price: {lte: 500}}} ], filter: [{range: {score: {gte: 45}}} ] } } }4.查询结果处理# 分数按照降序价格按照升序 GET /hotel/_search { query: { match_all: {} }, sort: [ { score:desc}, { price: asc} ] } # 按照经纬度升序 GET /hotel/_search { query: { match_all: {} }, sort: [ { _geo_distance: {location: { lat: 39.911, lon: 116.395 }, order: asc, unit: km } } ] }GET /hotel/_search { query: { match: { all: 如家 } }, highlight: { fields: { all: {}, name: {require_field_match: false} } } }
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门