elasticsearch - 在 Elasticsearch 数组中查找任何不等于 X 的值
问题描述
我想构建一个查询,该查询与在不等于给定值的多值字段中具有任何值的任何文档相匹配。
索引一些文档
POST /example/type
{"array": ["a", "b", "c"]} <--- 1
{"array": ["d", "e", "x"]} <--- 2
{"array": ["x"]} <--- 3
我想构建一个查询,说“匹配数组中任何值不等于 x 的任何文档。在上面的示例中,将匹配 (1) 和 (2),因为它们都包含至少一个非“x”值。文档 (3) 将被拒绝,因为它只包含“x”。
我已经尝试过布尔 must_not 和查询 DSL NOT (!) 运算符,但它们的工作原理是排除原则而不是逻辑否定相等,因此只返回文档 (1)。
我应该补充一点,性能在这里很重要,因此基于脚本的解决方案可能不起作用。
解决方案
Lucene 索引(这是 ElasticSearch 的基础)没有数组中值的原始顺序的概念。此外,对象数组不会像您期望的那样工作:您不能独立于数组中的其他对象查询每个对象。
我相信基于脚本的解决方案是唯一的出路
或者,在索引文档时,您可以添加其他参数“长度”
PUT my_test
{
"mappings": {
"properties": {
"array": {
"type": "keyword"
},
"count":{
"type": "integer"
}
}
}
}
现在搜索没有的文档(count==1 并且数组包含 a)
GET /my_test/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"count": 1
}
},
{
"term": {
"array": "x"
}
}
]
}
}
}
推荐阅读
- laravel - 我的表单没有将图像文件提交到控制器存储功能,这是什么问题
- python - 如何在 python docx 中检测列表的样式(项目符号或编号)?
- apache-kafka - Kafka Streams GlobalKTable 主题是否需要与它将加入的 KStream 主题相同数量的分区?
- c++ - 如何检测 C++ 中的组合键输入?
- sas - 根据以值结尾的值过滤 where 条件?
- javascript - 如何压缩或最小化分块下载的视频 - JavaScript
- python - 如何将一组图像转换为 numpy 数组?
- java - 反应组件隐藏在网站页面后面
- android - java.lang.RuntimeException:无法创建类 ViewModel [Kotlin] 的实例
- angular - 如何在 Angular 10 中使用 HTML 锚链接#id inside dialog (MatDialog)