elasticsearch - Elasticsearch脚本参数containsAll与文档中的值

标签 elasticsearch

我正在尝试使用Java SDK使用Elasticsearch脚本查询来确定作为参数传递的ID集合是否包含索引文档中的所有值。

这是一个简单的示例,它不起作用,我希望它与文档相匹配,但事实并非如此。

文档attributes字段是一个包含单个项目[2]的数组

BoolQueryBuilder qb = boolQuery();

Map<String, Object> params = new HashMap<String, Object>();
params.put( "list", Arrays.asList( 1L, 2L, 3L ) );

String expr = "params.list.containsAll(doc['attributes'])";

Script script = new Script( ScriptType.INLINE, "painless", expr, Collections.emptyMap(), params );

qb.should( scriptQuery( script ) );

但是,我尝试了这些有效的各种硬编码替代方案

硬编码.contains(2)可以正常工作
BoolQueryBuilder qb = boolQuery();

Map<String, Object> params = new HashMap<String, Object>();
params.put( "list", Arrays.asList( 2L ) );

String expr = "params.list.contains(2)";

Script script = new Script( ScriptType.INLINE, "painless", expr, Collections.emptyMap(), params );

qb.should( scriptQuery( script ) );


硬编码.containsAll([2])可以正常工作
BoolQueryBuilder qb = boolQuery();

Map<String, Object> params = new HashMap<String, Object>();
params.put( "list", Arrays.asList( 2L ) );

String expr = "params.list.containsAll([2])";

Script script = new Script( ScriptType.INLINE, "painless", expr, Collections.emptyMap(), params );

qb.should( scriptQuery( script ) );

最佳答案

必须在调用params.list之前强制转换containsAll元素:

{
  "query": {
    "bool": {
      "must": [
        {
          "script": {
            "script": {
              "inline": """
              params.list.stream()
                         .map(num -> (long) num)
                         .collect(Collectors.toList())
                         .containsAll(
                           doc['attributes'].stream()
                                            .collect(Collectors.toList()))""",
              "params": {
                "list": [
                  2
                ]
              }
            }
          }
        }
      ]
    }
  }
}

假设您的映射确实这样定义了atributes:
{
  "mappings": {
    "properties": {
      "attributes": {
        "type": "long"
      }
    }
  }
}

关于elasticsearch - Elasticsearch脚本参数containsAll与文档中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61477151/

相关文章:

elasticsearch - Kibana字段中的图标是什么意思?

elasticsearch - Elasticsearch电子邮件搜索与使用com的匹配查询不匹配

elasticsearch - Kibana显示 “Searching…”,不显示任何结果。确认的数据存在于ElasticSearch中

python - 将数据库内容索引到 Elasticsearch

node.js - 从非 AWS node.js 应用程序连接到 AWS Elasticsearch

python - 为什么弹性会引发此异常 "elasticsearch.exceptions.ConnectionError: ConnectionError(check_hostname requires server_hostname)"?

elasticsearch - 由于yml配置,FileBeat服务无法启动

c# - 选择具有特定数量的嵌套文档项目的文档

python - 将 "facet_filter"查询转换为 pyes 格式

elasticsearch - 使用logstash的csv文件输入处理在2/3天后停止工作