当前位置: 首页 > 面试题库 >

ElasticSearch脚本:检查数组是否包含值

乜坚成
2023-03-14
问题内容

假设我创建了一个像这样的文档:

PUT idx/type/1
{
   "the_field": [1,2,3]
}

我可以使用GET / idx / type / 1检索文档:

{
   "_index": "idx",
   "_type": "type",
   "_id": "1",
   "_version": 1,
   "found": true,
   "_source": {
      "the_field": [
         1,
         2,
         3
      ]
   }
}

现在,我想检查字段“ the_field”是否包含值2。我知道我可以使用term子句,但是我需要使用过滤器脚本检查它,因此我尝试了:

POST /idx/typ/_search
{
    "query": {
        "match_all": {}
    }, 
    "filter": {
        "script": {
           "script": "doc['the_field'].values.contains(2)"
        }
    }
}

并没有结果:

{
   "took": 6,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 0,
      "max_score": null,
      "hits": []
   }
}

为了测试我的mevl脚本语法是否正确,我尝试这样做:

POST /idx/type/_search
{
    "query": {
        "match_all": {}
    }, 
    "filter": {
        "script": {
           "script": "[1,2,3].contains(3)"
        }
    }
}

并获得正确的结果:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "idx",
            "_type": "type",
            "_id": "1",
            "_score": 1,
            "_source": {
               "the_field": [
                  1,
                  2,
                  3
               ]
            }
         }
      ]
   }
}

我究竟做错了什么?

我认为doc [‘the_field’]。values应该返回[1,2,3],不是吗?如果是这样,我的代码应该可以工作。

有人可以帮助我吗?谢谢!

更新

当我用[“ a”,“ b”,“ c”]替换代码中的所有[1、2、3]时,它起作用了。任何想法?


问题答案:

它与“ a”,“ b”,“
c”一起使用,因为the_field默认情况下将其作为字符串而不是整数存储在Elasticsearch中。您可以通过以下方式检查映射来验证:

 $ curl -XGET 'http://localhost:9200/idx/type/_mapping'

以下应设置适当的字段类型:

 $ curl -XPUT 'http://localhost:9200/idx/type/_mapping' -d '
 {
    "type" : {
        "properties" : {
            "the_field" : {"type" : "integer" }
         }
     }
 }

更新映射,重新索引您的数据,看看是否可行。如果需要,请参阅PUT Mapping
API
以获得其他指导。



 类似资料:
  • 问题内容: 我想为数组中的每个值返回一个布尔值,指示它是否在array中。我猜这应该是一个标准程序,但是我找不到有关如何执行此操作的任何信息。我的尝试如下: 但是,我得到了错误: 我使用的是numpy,因此首选使用numpy或标准Python的解决方案。 问题答案: 我相信您可以使用-

  • 问题内容: 找出JavaScript数组是否包含值的最简洁,最有效的方法是什么? 这是我知道的唯一方法: 有没有更好,更简洁的方法来实现这一目标? 这与Stack Overflow问题密切相关。在JavaScript数组中查找项目的最佳方法?解决使用数组查找对象的问题indexOf。 问题答案: 现代的浏览器,这不正是这一点,得到广泛支持的人,除IE: 你也可以使用,它不太直接,但对于过时的浏览器

  • 问题内容: 找出JavaScript数组是否包含值的最简洁,最有效的方法是什么? 这是我知道的唯一方法: 有没有更好,更简洁的方法来实现这一目标? 这与Stack Overflow问题密切相关。 在JavaScript数组中查找项目的最佳方法?解决使用数组查找对象的问题。 问题答案: 现代的浏览器,这不正是这一点,得到广泛支持的人,除IE: 你也可以使用,它不太直接,但对于过时的浏览器不需要使用。

  • 问题内容: 我正在尝试检测字符串是否包含至少一个存储在数组中的URL。 这是我的数组: 该字符串由用户输入并通过PHP提交。在确认页面上,我想检查输入的URL是否在数组中。 我尝试了以下方法: 无论输入什么,返回值始终为“找不到匹配项”。 这是正确的做事方式吗? 问题答案: 尝试这个。 如果要检查不区分大小写,请使用stristr()或stripos()。

  • 问题内容: 基本上,我的同伴一直在说,我可以使用另一种检查int数组是否包含int的方法来缩短代码,尽管他不会告诉我它是什么:P。 当前: 也尝试过此方法,尽管由于某种原因它总是返回false。 有人可以帮我吗? 谢谢。 问题答案: 这是Java 8解决方案

  • 问题内容: 我有一张桌子来存储有关我的兔子的信息。看起来像这样: 我该如何找到喜欢胡萝卜的兔子?我想出了这个: 我不喜欢那个查询。一团糟。 作为专职兔子管理员,我没有时间更改数据库架构。我只想适当地喂兔子。有没有更可读的方法来执行该查询? 问题答案: 从PostgreSQL 9.4开始,您可以使用operator: 如果改用 jsonb 类型,甚至可以在键上为查询建立索引: __ 当然,作为专职兔