sql - 使用Grails插件将SQL查询转换为Java Elasticsearch查询

标签 sql elasticsearch grails elasticsearch-plugin

如何将以下SQL查询转换为Java Elasticsearch查询?

SELECT s.*
FROM supplier_detail_info sdi
JOIN supplier s ON sdi.supplier_id = s.id
JOIN supplier_detail sd ON sdi.supplier_detail_id = sd.id
WHERE (sdi.value = '70' AND sd.id = 1 ) OR (sdi.value = '46' and sd.id = 4);

我尝试了以下操作(不包括上面的OR子句),但失败了:
def query = QueryBuilders.boolQuery().
                    must(QueryBuilders.nestedQuery('supplierDetailInfos', QueryBuilders.matchQuery("supplierDetailInfos.value", '46')))
                    .must(QueryBuilders.nestedQuery('supplierDetailInfos.supplierDetail', QueryBuilders.matchQuery("supplierDetailInfos.supplierDetail.id", 4)))

结果是:
{
      "bool" : {
        "must" : [ {
          "nested" : {
            "query" : {
              "match" : {
                "supplierDetailInfos.value" : {
                  "query" : "46",
                  "type" : "boolean"
                }
              }
            },
            "path" : "supplierDetailInfos"
          }
        }, {
          "nested" : {
            "query" : {
              "match" : {
                "supplierDetailInfos.supplierDetail.id" : {
                  "query" : 4,
                  "type" : "boolean"
                }
              }
            },
            "path" : "supplierDetailInfos.supplierDetail"
          }
        } ]
      }
    }

我正在使用grails 2.3.7,并具有以下域:
class Supplier {
    String name
    ....

    static hasMany = [supplierDetailInfos : SupplierDetailInfo]

    static searchable = {
        only = ['name', 'supplierDetailInfos']
        supplierDetailInfos component: true
    }
}

class SupplierDetailInfo {
    SupplierDetail supplierDetail
    Supplier supplier
    String value

    static searchable = {
        only = ['id', 'supplierDetail', 'value']
        supplierDetail component: true
    }
}

class SupplierDetail {
    String name
    ....

    static searchable = {
        only = ['id']
    }
}

我正在使用elasticsearch 2.3.5和 flex 搜索插件“org.grails.plugins:elasticsearch:0.1.0”。

据我了解,

must is equivalent to AND





should is equivalent to OR.



上面的查询应该只返回那些当vendor_detail id为4时Supplier_detail_info的值为'46'的供应商。但是它返回所有存在供应商详细信息值为'46'的供应商。它只是忽略了查询的“和sd.id = 4”部分。另外,我不知道如何使用“或”部分。

最佳答案

代替 bool(boolean) 查询,请尝试使用 bool(boolean) 内部查询和两个must子句的嵌套查询。我也认为匹配查询应该是术语查询,因为它们看起来像关键字/长字段而不是文本字段,并且如果您需要OR则必须使用must子句

{
   "query":{
      "nested":{
         "path":"supplierDetailInfos",
         "query":{
            "bool":{
               "must":[
                  {
                     "match":{
                        "supplierDetailInfos.value":"46"
                     }
                  },
                  {
                     "match":{
                        "supplierDetailInfos.supplierDetail.id":4
                     }
                  }
               ]
            }
         }
      }
   }
}

关于sql - 使用Grails插件将SQL查询转换为Java Elasticsearch查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49710451/

相关文章:

grails - Grails中的Unicode字符

mysql select 查询给出 ID(数字)等于文本的结果

sql - 在 SQL 数据库中存储电子邮件

elasticsearch - 如何在elasticsearch中测试日志的滚动和删除?

servlets - 在Grails 3应用程序中注册Servlet bean

grails - 关系多对一如何保存

mysql - 性能调优--Mysql

sql - 字符串拆分列并连接到另一个表

Elasticsearch match_all 仅返回一个结果

elasticsearch - elasticsearch可视化聚合产生的两个指标的商