7.5 Percolator (反向搜索)


文档摘要

7.5 Percolator (反向搜索) 7. Elasticsearch 高级特性:Percolator (反向搜索) Percolator(反向搜索)是 Elasticsearch 提供的一个强大的功能,它允许你存储查询(queries),然后针对新索引的文档运行这些查询,找出哪些文档与哪些查询匹配。 换句话说,不再是搜索文档来匹配查询,而是让文档“渗透”通过预先注册的查询,找出匹配的查询。 7.5.1 Percolator 的核心概念 Percolate Query (渗透查询): 一个标准的 Elasticsearch 查询,存储在特殊的 索引中。 Percolate API (渗透 API): 用于针对存储的 Percolate 查询测试文档的 API。

7.5 Percolator (反向搜索)

7. Elasticsearch 高级特性:Percolator (反向搜索)

Percolator(反向搜索)是 Elasticsearch 提供的一个强大的功能,它允许你存储查询(queries),然后针对新索引的文档运行这些查询,找出哪些文档与哪些查询匹配。 换句话说,不再是搜索文档来匹配查询,而是让文档“渗透”通过预先注册的查询,找出匹配的查询。

7.5.1 Percolator 的核心概念

  • Percolate Query (渗透查询): 一个标准的 Elasticsearch 查询,存储在特殊的 _percolator 索引中。

  • Percolate API (渗透 API): 用于针对存储的 Percolate 查询测试文档的 API。

  • _percolator 索引: 用于存储 Percolate 查询的特殊索引。

  • 文档渗透: 将新文档发送到 Percolate API,以确定哪些已存储的查询与之匹配。

7.5.2 Percolator 的应用场景

Percolator 在以下场景中非常有用:

  • 实时警报: 当新文档符合特定条件时,立即发出警报。例如,监控安全日志,一旦发现异常行为立即告警。

  • 个性化推荐: 根据用户的兴趣(存储为 Percolate 查询)推荐相关内容。

  • 内容路由: 根据文档内容将文档路由到不同的处理管道。

  • 法律合规: 当新文档违反了法规条款时,发出警报。

7.5.3 Percolator 的工作流程

  1. 存储查询: 首先,将你的 Elasticsearch 查询存储在 _percolator 索引中。每个查询都分配一个唯一的 ID。

  2. 索引文档: 当一个新文档被索引时,你使用 Percolate API 将文档发送到 Elasticsearch。

  3. 查询匹配: Elasticsearch 将文档与 _percolator 索引中存储的所有查询进行比较。

  4. 返回匹配的查询: Percolate API 返回与文档匹配的查询的 ID 列表。

7.5.4 代码实践:使用 Percolator

7.5.4.1 创建 _percolator 索引

首先,创建一个用于存储 Percolate 查询的索引。可以指定映射,也可以使用默认映射。

PUT /my_index { "mappings": { "properties": { "field1": { "type": "text" }, "field2": { "type": "keyword" } } } } PUT /my_index/_mapping/_doc { "properties": { "field1": { "type": "text" }, "field2": { "type": "keyword" } } }

7.5.4.2 存储 Percolate 查询

使用 _percolate 端点将查询存储到索引中。

PUT /my_index/_doc/query1/_create { "query": { "match": { "field1": "example" } } } PUT /my_index/_doc/query2/_create { "query": { "term": { "field2": "value" } } }

7.5.4.3 渗透文档

使用 Percolate API 测试文档,查看哪些查询匹配。

GET /my_index/_percolate { "doc": { "field1": "this is an example document", "field2": "value" } }

响应示例:

{ "took": 12, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "total": 2, "documents": [ { "_index": "my_index", "_id": "query1", "_version": 1, "_seq_no": 0, "_primary_term": 1 }, { "_index": "my_index", "_id": "query2", "_version": 1, "_seq_no": 1, "_primary_term": 1 } ] }

响应中的 documents 数组包含了匹配的查询的 ID。

7.5.4.4 更复杂的 Percolate 请求

可以使用更复杂的请求来控制 Percolate 过程。

  • 指定要渗透的字段: 可以使用 fields 参数指定要包含在渗透过程中的字段。

  • 高亮显示: 可以使用 highlight 参数来高亮显示匹配的文本。

GET /my_index/_percolate { "doc": { "field1": "this is an example document", "field2": "value" }, "fields": ["field1"], "highlight": { "fields": { "field1": {} } } }

7.5.4.5 使用 percolate 查询

还可以将 percolate 查询嵌入到更复杂的查询中。这允许你根据文档是否匹配任何已存储的 Percolate 查询来过滤结果。

GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "some_other_field": "some value" } }, { "percolate": { "field": "query", "document": { "field1": "this is an example document", "field2": "value" } } } ] } } }

在这个例子中,只有 some_other_field 匹配 "some value" 并且文档匹配任何已存储的 Percolate 查询的文档才会被返回。

7.5.5 Percolator 的优化

  • 查询优化: 确保你的 Percolate 查询是优化的。避免使用昂贵的查询,例如 wildcard 查询或正则表达式查询,除非绝对必要。

  • 索引优化: 合理配置索引,例如使用合适的分析器和映射。

  • 缓存: Elasticsearch 会缓存 Percolate 查询的结果。确保缓存大小足够大,以提高性能。

  • Routing: 如果你知道某些查询只可能匹配特定类型的文档,可以使用 routing 来限制 Percolate 过程只检查相关的查询。

7.5.6 Percolator 的局限性

  • 性能: Percolator 的性能取决于存储的查询的数量和查询的复杂性。大量的复杂查询可能会导致性能问题。

  • 维护: 管理大量的 Percolate 查询可能很困难。需要一种机制来添加、更新和删除查询。

  • 复杂性: Percolator 的配置和使用可能比较复杂,需要对 Elasticsearch 查询语言和索引有深入的了解。

7.5.7 总结

Percolator 是 Elasticsearch 中一个强大的工具,可以用于实现反向搜索。通过将查询存储在 _percolator 索引中,你可以轻松地找出哪些文档与哪些查询匹配。 尽管存在一些局限性,但 Percolator 在许多场景中都非常有用,例如实时警报、个性化推荐和内容路由。 通过合理的优化和管理,你可以充分利用 Percolator 的优势。


发布者: 作者: 转发
评论区 (0)
U