7.5 Percolator (反向搜索) 7. Elasticsearch 高级特性:Percolator (反向搜索) Percolator(反向搜索)是 Elasticsearch 提供的一个强大的功能,它允许你存储查询(queries),然后针对新索引的文档运行这些查询,找出哪些文档与哪些查询匹配。 换句话说,不再是搜索文档来匹配查询,而是让文档“渗透”通过预先注册的查询,找出匹配的查询。 7.5.1 Percolator 的核心概念 Percolate Query (渗透查询): 一个标准的 Elasticsearch 查询,存储在特殊的 索引中。 Percolate API (渗透 API): 用于针对存储的 Percolate 查询测试文档的 API。
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 的工作流程
存储查询: 首先,将你的 Elasticsearch 查询存储在 _percolator 索引中。每个查询都分配一个唯一的 ID。
索引文档: 当一个新文档被索引时,你使用 Percolate API 将文档发送到 Elasticsearch。
查询匹配: Elasticsearch 将文档与 _percolator 索引中存储的所有查询进行比较。
返回匹配的查询: 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 的优势。