当前位置: 首页 > wzjs >正文

在柬埔寨做网站开发快速的网站设计制作

在柬埔寨做网站开发,快速的网站设计制作,网站建设需求分析表怎么写,成都网站建设优创智汇今天,咱们来聊聊OpenSearch这个越来越火的开源搜索和分析引擎。很多做运维开发、后端(尤其是Go语言)开发以及系统架构的朋友,或多或少都会和它打交道。甚至在人工智能和个大语言模型领域,高效的数据检索也离不开类似的…

今天,咱们来聊聊OpenSearch这个越来越火的开源搜索和分析引擎。很多做运维开发、后端(尤其是Go语言)开发以及系统架构的朋友,或多或少都会和它打交道。甚至在人工智能和个大语言模型领域,高效的数据检索也离不开类似的技术。

本文将以一个具体的JSON文档为例,带大家一步步了解如何在OpenSearch中进行查询。无论是刚接触OpenSearch的新手,还是希望夯实基础的老鸟,相信这篇文章都能给大家带来一些实用的干货。

OpenSearch:数据世界的探照灯

在我们深入查询细节之前,先简单回顾一下OpenSearch是什么。OpenSearch是一个基于Apache Lucene的分布式、开源搜索和分析套件。 我们可以将海量数据灌入其中,然后进行快速、功能丰富的全文搜索。 想想看,无论是电商网站的商品搜索、应用的日志分析,还是复杂的数据洞察,OpenSearch都能大显身手。

OpenSearch查询:与数据对话的语言 (Query DSL)

OpenSearch提供了一种名为Query DSL (Domain Specific Language) 的强大查询语言,它使用JSON来定义查询。 这种方式非常灵活,可以构建出各种复杂的查询逻辑,满足多样化的数据检索需求。

实战演练:以上文中的文档为例

现在,让我们以上面这个具体的JSON文档为例,看看如何针对不同的字段和场景构建查询语句。

{"_index": "kai","_id": "gU9R45YBRUXt1YcbHAuw","_score": 1,"_source": {"attributes": {"data_stream": {"dataset": "default","namespace": "namespace","type": "record"},"log.file.path": "/var/log/pods/dev_base-service-dfdcb5ffc-qdzhj_8449fdda-2400-4155-be33-85090a946249/base-service/22.log","log.iostream": "stdout","logtag": "F"},"body": "<==        Row: 21, E-KSM-USDT, KSMUSDT, KSM-USDT, E, 0, 1, 0.0100000000000000, KSM, USDT, 0, 1.00000000, 1.00000000, USDT, 571, 758, 0, 8, 0E-8, 8000.00000000, 0.00002000, 0.00200000, -0.00050000, 0.00050000, 0.00025000, 0.00050000, 0.00025000, 0.00050000, 0.00020000, 0.00050000, 1, 0.10000000, 0.30000000, 1, 0, 1000, 2021-03-08 01:55:46, 2025-04-14 03:43:03, 0","instrumentationScope": {},"observedTimestamp": "2025-05-18T12:14:25.963530962Z","resource": {"k8s.container.name": "base-service","k8s.container.restart_count": "22","k8s.namespace.name": "dev","k8s.pod.name": "base-service-dfdcb5ffc-qdzhj","k8s.pod.uid": "8449fdda-2400-4155-be33-85090a946249"},"severity": {},"@timestamp": "2025-05-18T12:14:25.699012101Z"}
}

这是一个典型的日志类文档,包含了索引信息 (_index, _id) 以及源数据 (_source)。_source 内部又包含了多层嵌套的字段。

1. 根据文档ID (_id) 和索引 (_index) 查询

最直接的查询方式就是通过文档的唯一标识 _id 和其所在的索引 _index 来获取。OpenSearch 提供了 GET API 来实现这个功能。

示例:

假设我们要获取上述ID为 gU9R45YBRUXt1YcbHAuw 且在 kai 索引中的文档:

GET /kai/_doc/gU9R45YBRUXt1YcbHAuw

这条命令会直接返回该文档的完整内容。 也可以使用 HEAD 方法来检查文档是否存在而不返回内容。

2. 查询特定字段的值(精确匹配)

如果我们想查找某个字段具有特定值的文档,可以使用 term 查询。term 查询用于精确匹配,不会对查询文本进行分词。 对于像ID、状态码这类不需要分词的字段,term 查询非常高效。 如果字段是 keyword 类型,term 查询会查找未经分析的精确值。

示例:

查询 resource.k8s.container.name 字段值为 base-service 的所有文档:

GET /kai/_search
{"query": {"term": {"resource.k8s.container.name.keyword": "base-service"}}
}

注意: 这里我们假设 resource.k8s.container.name 字段在映射中有一个对应的 .keyword 子字段,这是OpenSearch中处理精确匹配文本的常见做法。 如果该字段本身就是 keyword 类型,则可以直接使用 resource.k8s.container.name

3. 查询嵌套字段中的值

对于像 attributes.data_stream.dataset 这样的嵌套字段,查询方式与普通字段类似,使用点符号 (.) 来访问。

示例:

查询 attributes.data_stream.dataset 字段值为 default 的所有文档:

GET /kai/_search
{"query": {"term": {"attributes.data_stream.dataset.keyword": "default"}}
}

如果嵌套对象是一个数组,并且需要在数组内对象的多个字段之间进行关联查询,那么可能需要使用 nested 查询。nested 查询会将嵌套对象视为独立的隐藏文档进行查询。

4. 模糊匹配和部分字符串查询

当我们需要在一个文本字段中查找包含特定子串的文档时,情况会复杂一些。

  • match 查询: 这是标准的全文搜索查询。 它会对查询字符串进行分词,然后去匹配字段中分词后的词条。
  • match_phrase 查询: 用于精确短语匹配,即查询字符串中的词条需要以相同的顺序出现在字段中。
  • query_string 查询: 允许使用更丰富的查询语法,包括通配符(*, ?)等。 但要注意,滥用前缀通配符可能会影响性能。
  • wildcard 查询: 专门用于通配符匹配。

示例:

查询 body 字段包含字符串 <== Row: 21 的文档。由于这个字符串包含特殊字符和空格,并且我们可能希望它作为一个整体被匹配,match_phrase 或者带有转义的 query_string 会更合适。

使用 match_phrase (假设 body 字段是文本类型,并且经过了适当的分词器处理,能够识别这个短语):

GET /kai/_search
{"query": {"match_phrase": {"body": "<==        Row: 21"}}
}

使用 query_string (需要对特殊字符进行转义,具体转义规则取决于Lucene的查询语法):

GET /kai/_search
{"query": {"query_string": {"query": "body:\"<==        Row: 21\""}}
}

实用建议: 对于日志内容这类长文本,通常会配置特定的分词器(Analyzer)来更好地处理。选择合适的分词器和查询类型对于搜索的准确性和性能至关重要。

5. 范围查询 (Range Query)

当我们需要根据数值或日期范围进行查询时,range 查询就派上用场了。

示例:

查询 @timestamp 字段在某个时间范围内的文档。例如,查询2025年5月18日12点到13点之间的日志:

GET /kai/_search
{"query": {"range": {"@timestamp": {"gte": "2025-05-18T12:00:00.000Z","lt": "2025-05-18T13:00:00.000Z"}}}
}

gte 表示大于等于 (greater than or equal to),lt 表示小于 (less than)。还可以使用 gt (大于) 和 lte (小于等于)。OpenSearch也支持相对时间,例如 “now-1h” 表示一小时前。

6. 组合查询 (Boolean Query)

实际场景中,我们往往需要组合多个查询条件。这时就需要用到 bool 查询。bool 查询包含以下几种子句:

  • must: 文档必须匹配这些子句。相当于逻辑与 (AND)。
  • filter: 和 must 类似,文档必须匹配,但它在过滤上下文中执行,不计算得分,并且可以被缓存,性能更好。
  • should: 文档应该匹配这些子句中的一个或多个。相当于逻辑或 (OR)。可以通过 minimum_should_match 参数控制至少需要匹配多少个 should 子句。
  • must_not: 文档绝不能匹配这些子句。相当于逻辑非 (NOT)。

示例:

查询 resource.k8s.namespace.namedev 并且 log.iostreamstdout 的文档:

GET /kai/_search
{"query": {"bool": {"must": [{ "term": { "resource.k8s.namespace.name.keyword": "dev" } },{ "term": { "log.iostream.keyword": "stdout" } }]}}
}

或者使用 filter 子句以获得更好的性能(如果我们不关心得分):

GET /kai/_search
{"query": {"bool": {"filter": [{ "term": { "resource.k8s.namespace.name.keyword": "dev" } },{ "term": { "log.iostream.keyword": "stdout" } }]}}
}
7. 只返回特定字段

默认情况下,OpenSearch会返回匹配文档的完整 _source。 如果只需要部分字段,可以在查询中指定,以减少网络传输和处理开销。

示例:

查询 resource.k8s.container.namebase-service 的文档,但只返回 log.file.path@timestamp 字段:

GET /kai/_search
{"_source": ["log.file.path", "@timestamp"],"query": {"term": {"resource.k8s.container.name.keyword": "base-service"}}
}

也可以使用 fields 参数来获取非 _source 中的字段(例如,如果某些字段被设置为 store: true 但不在 _source 中,或者想获取像 _id 这样的元数据字段)。

实用建议与技巧

  1. 理解我们的数据和映射 (Mapping): 映射定义了字段如何被存储和索引。正确的映射是高效、准确查询的基础。例如,对于需要精确匹配的文本字段,应使用 keyword 类型或为其创建 .keyword 多字段。
  2. 选择合适的查询类型: term 用于精确匹配,match 用于全文搜索,range 用于范围查询等。理解不同查询类型的适用场景至关重要。
  3. 优先使用 filter 上下文: 当不需要查询结果的得分(relevance score)时,将查询条件放在 bool 查询的 filter 子句中。这可以带来显著的性能提升,因为过滤器可以被缓存。
  4. 谨慎使用通配符和复杂查询: 尤其是在大型索引上,过于复杂的查询或开头使用通配符的查询可能会非常消耗资源。
  5. 利用 OpenSearch Dashboards: OpenSearch Dashboards (源自 Kibana) 提供了强大的可视化和数据探索界面,包括一个“Dev Tools”控制台,可以在其中方便地编写和测试查询语句。
  6. 查阅官方文档: OpenSearch 拥有非常完善的官方文档,当遇到问题或者想深入了解某个特性时,官方文档永远是最佳伙伴。 (可以参考 OpenSearch 官方文档网站)

总结

OpenSearch 凭借其强大的功能和灵活性,成为了处理和分析大规模数据的热门选择。掌握其核心查询语言 Query DSL,就像拥有了一把打开数据宝库的金钥匙。

http://www.dtcms.com/wzjs/4045.html

相关文章:

  • 网站后台编辑器下载东莞网站建设排名
  • nas做网站需要备案吗惠州seo推广公司
  • 合肥市做网站多少钱查看百度关键词价格
  • 合肥 网站制作营销策划主要做些什么
  • 青岛慧思网站建设十大门户网站
  • 自动优化网站软件没有了百度seo 优化
  • 如何设计网站logo亚马逊排名seo
  • 自助建站免费申请电商网络推广怎么做
  • 怎么做单页网站广州最新疫情通报
  • 武汉网站建设jk引擎搜索网站
  • 广州做网站公司排名夸克搜索
  • 网站建设招标模板2345网址导航怎么彻底删掉
  • 慢慢来 网站建设电脑学校培训
  • 深圳企业网站定制公司百度指数怎么提升
  • 怎么用自助网站北京整站线上推广优化
  • 网站开发 activex成都网站建设方案服务
  • 手机网站 滑动翻页深圳网页设计
  • 高端网站建设企业公司品牌线上推广方式
  • 卖东西怎么做网站网站手机版排名seo
  • 东莞哪家做网站好新闻发稿平台
  • 做网站被骗3000百度统计数据分析
  • 网站的系统建设方式网络推广都有什么方式
  • 北京建设公司网站如何做免费网站推广
  • 网站建设前期预算网上营销是做什么的
  • 国外网站界面网络广告的计费方式
  • 怎么做阿里国际网站的数据分析seo工资
  • 信阳做房产哪个网站好用福州seo网站管理
  • seo 能提高网站速度吗互联网广告推广好做吗
  • 手机端网站关键字排名网络营销做得比较成功的案例
  • 做网站有的浏览器全国最新的疫情数据