java - 如何在elasticsearch查询中通过 "type"(在doc中单独添加)在不同文档的同一索引中添加If-else条件?

标签 java elasticsearch elasticsearch-plugin

我正在使用带有java的elasticsearch 1.6。 实际上,我是弹性查询的新手。在学习阶段。 尝试一些高级条件。

我创建了一个索引“IndexABCD”,其中有两个不同的文档并由它们的“类型”字段标识。 下面是弹性文件中的示例文档。

例如 -

Doc1
{
    "id":"DS-1",
    "type":"DATASOURCE",
    "name":"test1",
    "category":"cat1",
    "subCategory":"subcat1"
}

Doc2
{
    "id":"FL-1",
    "type":"FLOW",
    "name":"test1"
}

Doc3
{
    "id":"DS-2",
    "type":"DATASOURCE",
    "category":"cat1",
    "subCategory":"subcat1",
    "name":"test2"
}

Doc4
{
    "id":"FL-3",
    "type":"FLOW",
    "name":"test3"
}

如何添加以下 if-else 条件来提供预期输出?

if(type=="Datasource"){
    category = "cat1";
    subCategory = "subCat1";
}

if(type=="DATASOURCE" && type="FLOW"){
    category = "cat1";
    subCategory = "subCat1";
    &
    don't apply category & subcategory on type FLOW 
}    

在我的案例中使用了以下查询,但我没有找到适合我的场景的完美解决方案。
在查询中,如果我给出 DATASOURCE 结果,例如 - 2 条记录,其中包含类别和子类别。 或者哪个查询适合当前查询?

Current Query:-    
{
  "query":  
 {
  "filtered" : {
    "query" : {
      "bool" : {
        "must" : [  {
          "bool" : {
            "should" : {
              "terms" : {
                "datasource_and_flow.type" : [ "DATASOURCE" ]
              }
            }
          }
        },{
          "query_string" : {
            "query" : "test*",
            "default_field" : "datasource_and_flow.name"
          }
        } ],
        "should": [
           {
          "bool" : {
            "should" : {
              "terms" : {
                "category" : [ "cat1" ]
              }
            }
          }
        }, {
          "bool" : {
            "should" : {
              "terms" : {
                "sub_category" : [ "subcat2" ]
              }
            }
          }
        }
        ]
      }
    },        
    "filter" : {      
    }
  }
},
  "from": 0,
  "size": 10,
  "sort": [],
  "facets": {}, "aggs": {
    "datasource_and_flow.type": {
      "terms": {
        "field": "type"
      }
    }  
    }
}

如果我们添加

datasource_and_flow.type = [ "DATASOURCE","FLOW"]

现在我们想要

total records = 2 records + flow by name "test*"

但当前查询仅给出 DATASOURCE 类型,未从 FLOW 获取记录

供您引用 - 索引 json 映射 - click here for JSON Mapping file

最佳答案

下面的查询首先通过“test”关键字过滤所有文档,然后应用一个 should 子句,检查 2 个条件中的任意 1 个条件,即 (DATASOURCE + cat1 + subcat2) OR (FLOW)

GET _search
{
  "from": 0,
  "size": 20,
  "query": {
    "query_string": {
      "query": "test*",
      "default_field": "name"
    },
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "type": "DATASOURCE"
                }
              },
              {
                "term": {
                  "category": "cat1"
                }
              },
              {
                "term": {
                  "sub_category": "subcat1"
                }
              }
            ]
          }
        },
        {
          "term": {
            "type": "FLOW"
          }
        }
      ],
      "minimum_number_should_match": 1
    }
  }
}

关于java - 如何在elasticsearch查询中通过 "type"(在doc中单独添加)在不同文档的同一索引中添加If-else条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42785788/

相关文章:

elasticsearch - Elasticsearch 查询以对top_hits进行过滤

node.js - Elasticsearch _bulk 更新问题给出 VersionConflictEngineException 消息

Java 正则表达式 - 字符 "("和 ")"与模式 "[\\p{Alpha} ' -,.] 匹配

java - 标签重叠(堆叠)有问题

Java反射: Creating class instance dynamically and assigning it to Parent object

java - 使用 Spring Roo 的 Hibernate OrderColumn

java - ElasticSearch 使用 Java RestHighLevelClient 通过 BulkRequest API 索引 100K 文档

Elasticsearch 字段名区分大小写

amazon-web-services - AWS IAM角色不适用于Elasticsearch 5.0.0-alpha2,但适用于2.3版本

elasticsearch - 如何在此Elasticsearch查询中添加其他条件进行过滤?