我正在使用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"))
这是正确的还是我缺少什么?
答案 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"))