问题标签 [elasticsearch-percolate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
elasticsearch - ElasticSearch 黑名单(子集匹配)
我想使用 ElasticSearch 实现关键字黑名单。基本上我想创建一个不允许用户搜索的禁止查询列表。然后我希望能够传入一个检查过的查询并查看它匹配哪些被禁止的查询(如果有的话)。
如果被禁止的查询具有其关键字的子集,则已检查的查询与被禁止的查询匹配。为了说明,让我举一个例子:
- 禁止查询:
- “黑人生活”
- “黑人的命也是命”
- “黑人的生命很重要”
- “黑人的命也是命”
- 检查查询:“黑人的命也是命”
- 火柴:
- “黑人生活”
- “黑人的命也是命”
只有前两个被禁止的查询匹配,因为它们是检查查询的严格子集。第三个被禁止的查询不匹配,因为它使用“事项”,而不是“事项”。最后一个被禁止的查询不匹配,因为它不是“黑人的命也是命”的严格子集,因为它有一个额外的关键字“rulez”。
有人告诉我,实现这一点的最佳方法是渗透指数。我的问题是如何创建一个渗透查询来实现与检查查询(传入文档)的子集匹配?
这是有关渗透查询的文档页面:https ://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html
这是关于子集匹配的相关答案: https ://discuss.elastic.co/t/subset-in-an-array/237459
ruby-on-rails - Elasticsearch 6.8:将渗透器添加到具有“join”类型的“parent_mapping”字段的索引时获得“mapper_parsing_exception”
请参阅下面的更新。
我正在努力在 Ruby on Rails 应用程序(Rails:5.2.6,Ruby:2.5.8)中将我们的 ES 从 5.6 升级到 6.8。我所做的一个重大改变是将主题索引上的多类型映射(类型:主题、帖子)合并为单个映射类型(主题)。除此之外,我使用新的连接字段(parent_mapping)和自定义类型字段更新了旧的父/子关系,以模仿旧的行为(如 ES 文档中所建议的那样)。
这是具有自定义类型和连接字段的主题索引当前映射
该索引有一个用于警报的 percolator 字段。我遇到的问题是当文档被索引到主题索引(自定义类型:post,parent_mapping:{name:post,parent:id})时,也会通过elasticsearch-api gem(版本6.0.3) .search 方法的有效载荷看起来像这样:
此时,索引中有一个文档,其中包含要在索引新文档时匹配的查询,如下所示:
因此,当我调用该es.client.search { ... percolate: { field: ... }
方法时,出现以下错误:{"type":"illegal_argument_exception","reason":"[routing] is missing for join field [parent_mapping]"}
.
这是 ES 抛出的完整的、有点未格式化的错误:
我已经尝试将带有父文档 ID 的路由键以及类似body: ... { document: {name: 'post', parent: parent_id}
负载内部的内容添加到 .search 调用。并且仍然不断收到相同的错误。我正在浏览代码并阅读过滤器的变化,但我的想法已经不多了。这部分代码库对我来说是新的,而 ES 对我来说也是相当新的,所以我确信我缺少一些东西。我还没有找到一个很好的例子来说明渗透器如何处理使用连接字段来创建父/子关系的索引,所以如果存在的话,一个指向它的链接肯定会有所帮助。
提前感谢您的任何建议或帮助。如果需要,我很乐意提供更多信息和上下文。
更新:
我能够在一个更简单的例子中缩小问题的范围。"document": { "type": "post" }
当我进行渗透搜索时,我还通过添加来解决路由问题。路由字段丢失消息的原因是索引中的父文档没有“_routing”字段,因为这些文档在创建时没有路由到任何地方(只有子文档被路由到与其父文档相同的分片中)。现在我遇到的问题是渗透查询没有找到我期望它找到的文档。下面是我用来直接在 ES 6.8 上重新创建问题的当前设置。
因此,在上面的示例中,我创建了一个新索引,然后使用 id 存储一个查询alert:1
。之后,我创建了一个父子文档(使用连接字段和自定义类型来模仿旧的多类型映射)。之后,我使用 percolate 字段进行搜索,并期望它返回 id 为 80 的子文档,但我没有得到任何结果。
所以在这一点上,如果在 ES 6.8 中存在与此设置相关的实际错误,我不知道我错过了什么或我做错了什么。
elasticsearch - 当文档的日期时间字段值为 2 天时,如何使用 Elastic Search 获取警报
percolate 可以在文档有任何更新时运行,我们可以识别与文档匹配的任何规则。但是我们如何使用它来查找日期时间字段值在 2 天之后的文档,例如,查找打开的票证和预计关闭日期前 2 天的票证。
elasticsearch - 为什么我有 ElasticSearch percolate 查询错误?
当我在 ElasticSearch 中创建索引并尝试使用 percolate 时,出现错误,即索引中不存在 percolate 类型的字段。但是当我在索引中观看时,字段存在。
我将向您展示映射,文档在索引、错误和查询中的样子。
请帮我!我真的在尽我所能在谷歌上找到的东西。也许有人知道是什么问题。
索引映射:
索引中的文档:
错误:
我的查询:
elasticsearch - Elasticsearch percolator 节点 JVM 内存堆
据我了解,JVM 推荐的堆大小最多为节点内存的 50%(并且不超过 32GB)。由于 Lucene 广泛使用文件系统缓存。
我的问题是:如果我们只使用一个专用的 ES 集群(3 个节点)进行渗透查询。在这种情况下,为 JVM 堆分配更多内存有意义吗?
据我了解,查询索引保存在内存中,因此磁盘 IO 操作受到限制。
如果可以,您会推荐什么?(我在考虑~75%)
查询索引包含 ~200K 查询
谢谢