Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Elasticsearch必须包含一些值,而不能包含所有其他值_Arrays_Node.js_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Search - Fatal编程技术网 elasticsearch,search,Arrays,Node.js,elasticsearch,Search" /> elasticsearch,search,Arrays,Node.js,elasticsearch,Search" />

Arrays Elasticsearch必须包含一些值,而不能包含所有其他值

Arrays Elasticsearch必须包含一些值,而不能包含所有其他值,arrays,node.js,elasticsearch,search,Arrays,Node.js,elasticsearch,Search,因此,我有一个具有以下映射的索引: { "tests": { "mappings": { "test": { "properties": { "arr": { "properties": { "name": { "type": "long"

因此,我有一个具有以下映射的索引:

{
"tests": {
    "mappings": {
        "test": {
            "properties": {
                "arr": {
                    "properties": {
                        "name": {
                            "type": "long"
                        }
                    }
                }
            }
        }
    }
}
我有3个文档,字段“arr”的值如下:

  • arr:[{name:1},{name:2},{name:3}]
  • arr:[{name:1},{name:2},{name:4}]
  • arr:[{name:1},{name:2}]
  • 我希望以一种能够找到所有名称值都位于名称数组中的文档的方式进行搜索。但是,文档不需要拥有数组的所有值,如果它有一个值不在数组中,那么文档就不好

    例如:

  • 如果我的名称数组是
    [1,2]
    ,那么我只需要文档3,但我拥有所有的名称
  • 如果我的名称数组是
    [1,2,3]
    ,那么我想要文档1和3,但我只有
    必须
    的文档1,所有
    必须
  • 如果我的名称数组是
    [1,2,4]
    ,那么我想要文档2和3,但我只有
    必须
    的文档2,所有
    都应该
  • 如果我的名称数组是
    [1]
    ,那么我不需要文档,但我拥有所有文档
  • 这里的数组很小,在我的项目中,文档中的数组更大,比较数组也更大

    因此,具体而言,我需要以以下方式进行搜索:

  • 文档中的所有名称都在名称数组中
  • 文档不需要包含名称数组中的所有值
  • 提前感谢您使用脚本编写(无映射更改) 不需要对您已有的内容进行映射更改

    我想出了下面的剧本。我相信核心逻辑在剧本中,我认为这是不言自明的

    POST test_index_arr/_search
    {
      "query":{
        "bool": {
          "filter": { 
            "script": {
              "script": {
                "source" : """
                  List myList = doc['arr.name'];
                  int tempVal = myList.size();
                  for(int i=0; i<params.ids.size(); i++){
                    long temp = params.ids.get(i);
                    if(myList.contains(temp))
                    {
                      tempVal = tempVal - 1;
                    }
    
                    if(tempVal==0){
                      break;
                    }
                  }
    
                  if(tempVal==0)
                    return true;
                  else
                    return false;
                """,
                "lang"   : "painless",
                "params": {
                  "ids": [1,2,4]
                }
              }
            }
          }
        }
      }
    }
    
    测试后索引\u arr/\u搜索
    {
    “查询”:{
    “布尔”:{
    “筛选器”:{
    “脚本”:{
    “脚本”:{
    “来源”:”
    列表myList=doc['arr.name'];
    int tempVal=myList.size();
    
    对于(int i=0;我是否可以像添加其他字段一样控制映射?准确地说,只需添加一个字段即可。是的,我可以使用它执行任何操作:)抱歉,我已更新了我的答案。请告诉我是否有帮助!这是一个很好的解决方案,但适用于数组中元素很少的小数组。在您的查询中,如果我有一个名为
    “1/4”
    的文档,并且要使其正常工作,我必须添加
    “1/4”"
    到术语查询。对于小数组,它可以工作,但是数组中有超过20或50个项目和我的文档,我必须尽一切可能使它工作,这真的很好吗?@ArrowLightning有效点。我想出了另一个解决方案,不需要更改映射。请检查并告诉我它是否有帮助。我一直都在考虑ady之前考虑过脚本,我想知道是否还有其他选择,但脚本很好用!