建立企业网站步骤,wordpress哔哩哔哩视频播放器,泉州响应式网站建设,长治一般做一个网站需要多少钱关注#xff1a;CodingTechWork
引言 在当今大数据应用中#xff0c;Elasticsearch#xff08;简称 ES#xff09;以其高效的全文检索、分布式处理能力和灵活的查询语法#xff0c;广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES#xff0c;用户…关注CodingTechWork
引言 在当今大数据应用中Elasticsearch简称 ES以其高效的全文检索、分布式处理能力和灵活的查询语法广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES用户可以轻松地查询大量数据、进行复杂的数据筛选、聚合分析等操作。 本文将结合实际应用场景深入讲解 Elasticsearch 基础和高级查询语句的使用原理与技巧帮助读者通过实践掌握 ES 查询的核心概念和技术。
索引
索引设计与数据模型 首先我们假设demo_operate_log_data_m202501_read索引存储了用户的基本信息。每个文档表示一个用户字段包括
user_id用户唯一标识符例如user_123
name用户姓名
age用户年龄
gender用户性别如male 或 female
email用户邮箱
phone_number用户电话号码
register_date用户注册时间日期类型
last_login用户最后登录时间日期类型
location用户所在地理位置如Beijing、Shanghai这些字段将在我们接下来的查询中作为查询条件以获取用户的详细信息。下面将根据不同的查询需求展示 Elasticsearch 查询的基础和高级用法。
创建索引 在 Elasticsearch 中创建索引时通常会定义索引的映射mapping指定字段类型、分析器等属性。下面是一个示例索引创建语句针对 demo_operate_log_data_m202501_read索引我们假设它包含了与用户相关的字段。
示例demo_operate_log_data_m202501_read索引创建语句
PUT /demo_operate_log_data_m202501_read
{mappings: {properties: {user_id: {type: keyword // 用户唯一标识符通常用 keyword 类型以便精确匹配},name: {type: text // 用户姓名使用 text 类型以支持全文搜索},age: {type: integer // 用户年龄使用整数类型},gender: {type: keyword // 用户性别通常是固定值使用 keyword 类型},email: {type: keyword // 用户邮箱使用 keyword 类型},phone_number: {type: keyword // 用户电话号码使用 keyword 类型},register_date: {type: date // 注册时间使用日期类型},last_login: {type: date // 最后登录时间使用日期类型},location: {type: text // 用户所在位置使用 text 类型以支持全文搜索}}}
}解释
user_id使用 keyword 类型这样可以确保查询时进行精确匹配因为 keyword 不会被分词。name使用 text 类型支持全文搜索可以在姓名中进行模糊搜索。age使用 integer 类型用于存储年龄的整数值。gender、email 和 phone_number使用 keyword 类型这些字段通常会是固定值或标识符适合精确查询。register_date 和 last_login使用 date 类型适合存储日期时间格式数据。location使用 text 类型以便对用户的地理位置信息进行全文搜索。
插入数据 接下来我们将根据刚才定义的demo_operate_log_data_m202501_read索引插入一些示例数据。这些数据将包括用户的user_id、name、age、gender、email、phone_number、register_date、last_login 和 location字段。
POST /demo_operate_log_data_m202501_read/_doc/1
{user_id: U001,name: Alice Wang,age: 29,gender: female,email: alice.wangexample.com,phone_number: 86-13800000001,register_date: 2023-01-15T10:30:00,last_login: 2025-01-05T15:45:00,location: Beijing, China
}POST /demo_operate_log_data_m202501_read/_doc/2
{user_id: U002,name: Bob Zhang,age: 34,gender: male,email: bob.zhangexample.com,phone_number: 86-13800000002,register_date: 2022-06-10T08:20:00,last_login: 2025-01-06T09:00:00,location: Shanghai, China
}POST /demo_operate_log_data_m202501_read/_doc/3
{user_id: U003,name: Charlie Li,age: 25,gender: male,email: charlie.liexample.com,phone_number: 86-13800000003,register_date: 2024-03-22T14:10:00,last_login: 2025-01-07T18:30:00,location: Guangzhou, China
}POST /demo_operate_log_data_m202501_read/_doc/4
{user_id: U004,name: David Liu,age: 40,gender: male,email: david.liuexample.com,phone_number: 86-13800000004,register_date: 2020-11-18T16:50:00,last_login: 2025-01-04T12:00:00,location: Shenzhen, China
}POST /demo_operate_log_data_m202501_read/_doc/5
{user_id: U005,name: Eva Zhang,age: 31,gender: female,email: eva.zhangexample.com,phone_number: 86-13800000005,register_date: 2021-09-30T11:00:00,last_login: 2025-01-06T16:10:00,location: Chengdu, China
}解释
每条数据通过 POST 请求插入到 Elasticsearch 索引demo_operate_log_data_m202501_read 中。数据中的 user_id 为每个用户的唯一标识符。name、age、gender、email、phone_number、register_date、last_login 和 location 都是与用户相关的属性按需求填充相应的信息。日期格式为yyyy-MM-ddTHH:mm:ss符合 Elasticsearch 的日期格式。
插入成功后的输出 插入数据成功后Elasticsearch 会返回类似下面的响应每个请求的响应可能有所不同以下是一个例子
{_index: demo_operate_log_data_m202501_read,_id: 1,_version: 1,result: created,_shards: {total: 1,successful: 1,failed: 0},_seq_no: 0,_primary_term: 1
}每个用户的文档都会被成功插入到索引中并可以通过 ID 或查询来访问。
基础查询
精确匹配查询 (term 查询)
在 Elasticsearch 中精确匹配查询通常使用 term 查询。假设我们要查询 user_id 为 U001 的用户基本信息可以使用如下的 term 查询
GET /demo_operate_log_data_m202501_read/_search
{query: {term: {user_id: U001}}
}解释
term 查询用于精确匹配字段的值。如果 user_id 在映射中被定义为 keyword 类型那么它会按照原样进行精确匹配。
匹配查询 (match 查询)
对于文本类型的字段match 查询能够实现更灵活的搜索。例如我们要查询所有名字包含 “John” 的用户
GET /demo_operate_log_data_m202501_read/_search
{query: {match: {name: Charlie Li}}
}解释
match 查询适用于全文搜索ES 会对文本字段进行分词后进行搜索。对于如 name 这样的文本字段match 查询可以匹配到所有包含 “Charlie Li” 的用户无论是名字中间、开始或结束部分。
范围查询 (range 查询)
如果我们想查询年龄在 20 到 30 岁之间的用户可以使用 range 查询
GET /demo_operate_log_data_m202501_read/_search
{query: {range: {age: {gte: 20,lte: 30}}}
}解释
range 查询适用于数字或日期类型字段。通过设置 gte大于或等于和 lte小于或等于来定义一个范围。该查询返回所有年龄在 20 到 30 岁之间的用户。
布尔查询 (bool 查询)
布尔查询可以将多个查询条件组合起来。假设我们要查询年龄在 20 到 30 岁之间且性别为 “female” 的用户可以使用 bool 查询
GET /demo_operate_log_data_m202501_read/_search
{query: {bool: {must: [{range: {age: {gte: 20,lte: 30}}},{term: {gender: female}}]}}
}解释
bool 查询结合了多个查询条件其中must 表示条件必须满足。range 查询筛选年龄term 查询筛选性别。must 可以包含任意多个查询子句适用于复杂的多条件组合查询。
高级查询
聚合查询 (aggregations)
聚合查询允许我们对数据进行统计、分组和汇总分析。假设我们需要统计每个年龄段内的用户数量可以使用 range 聚合查询
GET /demo_operate_log_data_m202501_read/_search
{size: 0,aggs: {age_groups: {range: {field: age,ranges: [{to: 18},{from: 18,to: 30},{from: 30,to: 50},{from: 50}]}}}
}解释
该查询使用range聚合将用户的年龄划分为不同的区间并统计每个区间内的用户数量。size: 0 表示不返回文档内容只返回聚合结果。 若size不为0则返回文档内容。
多字段匹配查询 (multi_match 查询)
如果我们需要在多个字段上进行搜索例如查询包含 “Charlie Li” 的用户并且可以在 name、email 和 phone_number 等字段中匹配我们可以使用 multi_match 查询
GET /demo_operate_log_data_m202501_read/_search
{query: {multi_match: {query: Charlie,fields: [name,email,phone_number]}}
}解释
multi_match 查询可以在多个字段中查找与查询词匹配的文档适用于需要在多个字段中执行类似的查询。fields参数指定要查询的字段列表query 是我们要搜索的关键词。默认情况下multi_match 查询会在所有指定的字段中查找只要其中一个字段包含查询词中的任意词文档就会匹配并返回。例如在你的查询中如果 name 字段匹配 “Charlie”或者 email 字段匹配 “Li”或者两者都有文档都会被返回。
分页查询 (from 和 size 参数)
在面对大量数据时通常会进行分页查询以分批次返回查询结果。假设我们要查询第 2 页的用户每页显示 2 条记录
GET /demo_operate_log_data_m202501_read/_search
{query: {match_all: {}}
}GET /demo_operate_log_data_m202501_read/_search
{query: {match_all: {}},from: 1,size: 2
}先验证查看全部的 再分页查
解释
query - match_all:match_all 查询会返回该索引中的所有文档。这是一种无条件匹配所有文档的查询通常用于检索整个索引的数据。from: 1:这是分页的参数之一表示从第 2 条记录开始从 0 开始计数。所以会跳过第 1 条文档返回从第 2 条文档开始的结果。size: 2:这个参数控制每次查询返回的文档数量。设置为 2 表示查询会返回 2 条结果。
字段排序查询 (sort 参数)
在某些情况下我们需要对查询结果进行排序。例如查询最新注册的 2 个用户可以按 register_date字段进行排序
GET /demo_operate_log_data_m202501_read/_search
{query: {match_all: {}},sort: [{register_date: {order: desc}}],_source: [user_id, name, register_date]
}GET /demo_operate_log_data_m202501_read/_search
{query: {match_all: {}},sort: [{register_date: {order: desc}}],size: 2
}先验证看所有的排序 排序筛选前两个
解释
sort 参数用于指定排序规则register_date 字段按降序排列表示返回最新注册的用户。size 限制每次返回的记录数量。
模糊查询 (fuzzy 查询)
如果用户输入的查询条件可能包含拼写错误fuzzy 查询可以帮助我们进行模糊匹配。例如我们要查询姓氏为 “Charlie Li” 的用户但用户可能输入 “Charlie Lixxx”
GET /demo_operate_log_data_m202501_read/_search
{query: {bool: {should: [{fuzzy: {name: {value: Zhang,fuzziness: AUTO}}}]}}
}解释
bool查询:bool 查询的 should 子句意味着至少满足其中一个条件。当前查询中只有一个模糊查询条件。fuzzy 查询:fuzzy查询是用于模糊匹配的。在这里查询目标是 name 字段查询的关键词是 “Zhang”模糊度为 AUTO即自动选择最佳的模糊度。fuzziness: AUTO:AUTO 表示根据字符串的长度自动选择合适的模糊度。例如短字符串可能只会有一个字符的差异fuzziness: 1而较长的字符串可能允许更多的字符差异fuzziness: 2 或更多。
总结 通过本篇博客我们详细介绍了 Elasticsearch 的基础和高级查询语法。我们展示了如何使用精确匹配查询term、全文搜索match、范围查询range、布尔查询bool等技术帮助开发者快速检索用户基础信息。同时我们还探讨了如何进行数据统计、聚合查询、多字段匹配等。