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"))
我正在使用 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"))