Elasticsearch 高级休息客户端多于 1 个字段搜索

Elasticsearch high level rest client more than 1 field search

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

我可以使用查询生成器进行如下所示的单个字段搜索:

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

但这就像在多个字段中搜索相同的字符串(值)。这不是我想要的。 我基本上想要 SQL AND in where 子句(如果它也与正则表达式一起使用则更好)。

更新:

请注意@Meet Rathod 的以下回答有效并被接受。

但是,为了推进它,所以如果我还需要一个条件 SQL 或者,我下面的代码是否正确。 要求:

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"))

这是正确的还是我遗漏了什么?

据我了解,您只需要那些满足所有您的条件的文档应该在结果中列出。如果是这种情况,我相信在您的查询中添加另一个 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"))