📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
在服务端测试过程中我们会碰到提测阶段的新功能研发中,需要查询数据库去验证数据的准确性以及完整性的时候,此时如果研发用到Elasticsearch数据库。那我们不熟悉该如何去做呢,我们先来熟悉下这个数据库
一、ES(Elasticsearch)
1.类型:Elasticsearch是一种基于Lucene的分布式搜索引擎,它兼具NoSQL数据库的特性,主要用于全文搜索、结构化搜索、分析等场景。
2.作用
-
高效全文搜索
Elasticsearch提供了强大的全文搜索功能,支持复杂的查询语法和多种数据类型,能够快速响应用户查询需求。其全文搜索的实现依赖于倒排索引,这种数据结构使得搜索引擎能够快速定位包含查询词的文档。
-
实时数据分析
Elasticsearch具备实时数据处理能力,能够在数据写入后几乎立即提供查询和分析结果,这使得其在金融、电子商务等需要快速响应的行业中具有广泛应用。
-
可扩展性强
Elasticsearch的分布式架构设计使其具备很强的可扩展性。用户可以通过增加节点来扩展集群的容量和性能,从而处理更大的数据量和更高的查询并发。
-
灵活的数据结构
Elasticsearch支持灵活的数据结构,允许用户存储和查询各种类型的数据,包括结构化、半结构化和非结构化数据。
-
企业级安全性和权限管理
通过X-Pack插件,Elasticsearch提供了细粒度的权限管理、数据加密、审计日志等安全功能,满足企业在数据保护和合规性方面的需求。
二、数据结构
Elasticsearch(ES)数据库的数据结构主要围绕索引(Index)、文档(Document)和字段(Field)来构建。以下是一个具体的例子,用于说明ES数据库中的数据结构,并主要体现索引字段的特点:
1.索引(Index)
-
名称:
products
-
功能:用于存储所有产品信息的索引。
2.文档(Document)
-
在Elasticsearch中,每个产品都表示为一个文档。
-
文档以JSON格式存储,包含多个字段。
3.字段(Field)
-
每个文档包含多个字段,用于描述产品的不同属性。
-
字段可以包含不同类型的数据,如文本、数值、日期等。
三、示例场景
假设我们有一个电子商务平台,需要存储和搜索产品信息。在Elasticsearch中,我们可以创建一个名为products
的索引来存储这些信息。
示例数据
以下是一个示例文档,展示了在products
索引中可能存储的产品信息:
{
"product_id": "12345", // 产品ID,数值类型
"product_name": "Laptop", // 产品名称,文本类型
"category": "Electronics", // 产品类别,文本类型
"price": 999.99, // 产品价格,数值类型
"description": "A powerful laptop for professionals.", // 产品描述,文本类型
"release_date": "2023-01-01" // 产品发布日期,日期类型
}
索引字段详解
- product_id
-
-
类型:数值类型(如long)
-
-
-
用途:唯一标识每个产品。
-
- product_name
-
类型:文本类型(如text)
-
-
-
用途:存储产品的名称,支持全文搜索。
-
- category
-
类型:文本类型(如keyword)
-
-
-
用途:存储产品的类别,通常用于过滤和聚合查询。
-
- price
-
类型:数值类型(如float或double)
-
-
-
用途:存储产品的价格,支持范围查询和排序。
-
- description
-
-
类型:文本类型(如text)
-
-
用途:存储产品的详细描述,支持全文搜索。
- release_date
-
-
类型:日期类型(如date)
-
-
-
用途:存储产品的发布日期,支持日期范围查询和排序。
-
注意事项
-
在Elasticsearch中,字段的数据类型由字段的属性
type
指定。 -
字段可以具有其他属性,如
index
(控制字段是否编入索引被搜索)、store
(指定是否将字段的原始值写入索引)、boost
(字段级别的助推,定义字段在文档中的重要性/权重)等。 -
Elasticsearch支持动态映射(根据文档中的字段自动创建映射关系)和显式映射(手动定义字段类型)。
四、示例查询
以下是一个示例查询语句,用于在products
索引中搜索产品名称为“Laptop”的文档:
GET /products/_search
{
"query": {
"match": {
"product_name": "Laptop"
}
}
}
综上所述,Elasticsearch数据库的数据结构通过索引、文档和字段来组织数据,每个字段都可以具有不同的数据类型和属性,以满足各种搜索和查询需求。
在Elasticsearch中,
GET /{索引名}/_search
中的{索引名}
并不是传统关系型数据库中的“表名”,而是Elasticsearch中的“索引名”。Elasticsearch是一个基于Lucene的搜索引擎,它使用索引(Index)来存储和组织数据。
在Elasticsearch中,索引类似于关系型数据库中的数据库(Database)或表(Table)的概念,但它更加灵活和强大。一个索引可以包含多个文档(Document),每个文档是一个JSON对象,可以包含多个字段(Field)。这些字段可以包含不同类型的数据,如文本、数值、日期等。
当你执行一个搜索查询时,你需要指定在哪个索引中进行搜索。这个索引名就是你在创建索引时指定的名称,它用于在Elasticsearch集群中唯一标识该索引。
ES(Elasticsearch)数据库的基础查询语句用法涉及多种查询类型,以满足不同的搜索需求。以下是一些常用的基础查询语句及其用法:
一、基本查询结构
在Elasticsearch中,查询通常具有以下基本结构:
GET /{索引名}/_search
{
"query": {
"{查询类型}": {
"{查询条件}": "{查询条件值}"
}
}
}
其中,{索引名}是你要搜索的索引,{查询类型}是查询的类型(如match_all、match、term等),{查询条件}和{查询条件值}则根据具体的查询类型而定。
二、常用查询类型及用法
查询所有(match_all)用于返回索引中的所有文档。
GET /{索引名}/_search
{
"query": {
"match_all": {}
}
}
全文检索查询(match)用于执行全文检索,适合搜索文本字段。
GET /{索引名}/_search
{
"query": {
"match": {
"{字段名}": "{查询文本}"
}
}
}
例如,查询城市字段中包含“York”的文档:
GET /my_index/_search
{
"query": {
"match": {
"city": "York"
}
}
}
精确匹配查询(term)用于对某个字段的精确值进行查询,常用于不分词的字段(如ID、标签、关键词等)。
GET /{索引名}/_search
{
"query": {
"term": {
"{字段名}": "{精确值}"
}
}
}
例如,查询城市字段为“zhengzhou”的文档:
GET /my_index/_search
{
"query": {
"term": {
"city": "zhengzhou"
}
}
}
范围查询(range):用于查询数值、日期、时间等范围内的数据。
GET /{索引名}/_search
{
"query": {
"range": {
"{字段名}": {
"gte": {起始值},
"lte": {结束值}
}
}
}
}
范围参数可以只写一个,例如仅保留"gte": 100,则代表字段值大于等于100。其他范围参数包括:
gt:大于(>)
gte:大于且等于(>=)
lt:小于(<)
lte:小于且等于(<=)
布尔查询(bool):用于组合多个子查询,支持逻辑操作符AND(must)、OR(should)和NOT(must_not)以及过滤器(filter)。
GET /{索引名}/_search
{
"query": {
"bool": {
"must": [
{
"{查询类型}": {
"{字段名}": "{查询条件值}"
}
}
],
"must_not": [
{
"{查询类型}": {
"{字段名}": "{查询条件值}"
}
}
],
"should": [
{
"{查询类型}": {
"{字段名}": "{查询条件值}"
}
}
],
"filter": [
{
"{查询类型}": {
"{字段名}": "{查询条件值}"
}
}
]
}
}
}
例如,查询城市为“zhengzhou”且不为“shanghai”的文档,或者城市为“changsha”的文档:
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "zhengzhou"
}
}
],
"must_not": [
{
"match": {
"city": "shanghai"
}
}
],
"should": [
{
"match": {
"city": "changsha"
}
}
]
}
}
}
前缀匹配查询(prefix):用于查询字段值的前缀匹配,常用于搜索补全或模糊搜索。
GET /{索引名}/_search
{
"query": {
"prefix": {
"{字段名}": "{前缀值}"
}
}
}
通配符查询(wildcard):支持*(匹配任意字符)和?(匹配单个字符)的通配符查询。
GET /{索引名}/_search
{
"query": {
"wildcard": {
"{字段名}": "{通配符模式}"
}
}
}
模糊查询(fuzzy):用于查询与某个值相似的字段,常用于容忍拼写错误的场景。
GET /{索引名}/_search
{
"query": {
"fuzzy": {
"{字段名}": {
"value": "{模糊值}"
}
}
}
}
例如,查询城市字段与“shangh”相似的文档:
GET /my_index/_search
{
"query": {
"fuzzy": {
"city": "shangh"
}
}
}
三、其他常用功能
分页_通过from和size参数设置分页,相当于SQL的limit和offset结构。
GET /{索引名}/_search
{
"from": {起始位置},
"size": {每页大小}
}
排序_使用sort子句设置排序条件,类似SQL的order by语句。
GET /{索引名}/_search
{
"query": {
...
},
"sort": [
{
"{字段名1}": {
"order": "asc" // 或 "desc"
}
},
{
"{字段名2}": {
"order": "asc" // 或 "desc"
}
}
]
}
源字段过滤_使用_source参数控制哪些字段需要返回,哪些不需要返回。
GET /{索引名}/_search
{
"_source": ["{字段名1}", "{字段名2}"],
"query": {
...
}}
或者指定includes和excludes:
GET /{索引名}/_search
{
"_source": {
"includes": ["{字段名1}", "{字段名2}"],
"excludes": ["{字段名3}"]
},
"query": {
...
}
}
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】