Elasticsearch高级Rest客户超过1个字段搜索

时间:2019-07-11 19:47:29

标签: scala elasticsearch rest-client

我正在使用Scala 2.12查询ElasticSearch(6.5)。

我可以使用querybuilders进行单个字段搜索,如下所示:

val searchSourceBuilder = new SearchSourceBuilder()
val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
searchSourceBuilder.query(qb)

使用以上内容(我需要进行正则表达式搜索),我可以搜索相关文档。

但是,我有更复杂的要求,我必须在多个字段值对上匹配文档。

header.fieldname应该与模式“ 01 _。+ data”匹配 和 header.fieldname2应该匹配模式“ type 。+ _ 2019-07-11”

基本上,它类似于SQL在2个或更多列(和值字符串)上的where子句。

我正在检查https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

但这就像在多个字段中搜索相同的字符串(值)一样。这不是我想要的。 我基本上希望在where子句中使用类似SQL AND的东西(最好也使用regex)。

更新:

请注意@Meet Rathod作品的以下答案并被接受。

但是,继续进行下去,因此,如果我还需要一个条件,即SQL OR,下面的代码是否正确? 必填:

header.fieldname: 01_.+data AND header.fieldname2: type.+_2019-07-11 AND (header.fieldname3: some_thing OR header.fieldname3: some_other_thing)

代码:

val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
      .must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_thing"))
.should(QueryBuilders.regexpQuery("header.fieldname3", "some_other_thing"))

这是正确的还是我缺少什么?

1 个答案:

答案 0 :(得分:0)

据我了解,您只希望那些满足您条件全部的文档应在结果中列出。如果是这种情况,我相信在查询中添加另一个must子句应该可以得到预期的结果。原始查询看起来像这样。

{
  "query": {
    "bool": {
      "must": [
        {
          "regexp": {
            "header.fieldname": "01_.+data"
          }
        },
        {
          "regexp": {
            "header.fieldname2": "type.+_2019-07-11"
          }
        }
      ]
    }
  }
}

我不确定,但是您的Scala代码应该看起来像这样。

val qb = new BoolQueryBuilder()
      .must(QueryBuilders.regexpQuery("header.fieldname", "01_.+_20190711_data"))
      .must(QueryBuilders.regexpQuery("header.fieldname2", "type.+_2019-07-11"))