ElasticSearch 如何为 QueryBuilder 设置特定索引 (Java API)
ElasticSearch how to set specific index for a QueryBuilder (Java API)
我正在尝试将 elasticsearch 的这个多重 GET 操作转换为 Java/Kotlin 等效代码
curl "localhost:9200/index1, index2/_search?pretty=true" -d '{
"query" : {
"bool" : {
"must" : [
{
"indices" : {
"indices" : ["index1"],
"query" : {
SOMETHING1
}
}
},
{
"indices" : {
"indices" : ["index2"],
"query" : {
SOMETHING2
}
}
}
]
}
}
}'
我的解决方案是
val searchRequest = SearchRequest("index1", "index2")
val searchSourceBuilder = SearchSourceBuilder()
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
val qbFirst: BoolQueryBuilder = QueryBuilders.boolQuery()
qbFirst.must().add(SOMETHING1)
val qbSecond: BoolQueryBuilder = QueryBuilders.boolQuery()
qbSecond.must().add(SOMETHING2)
qb.must().add(qbFirst)
qb.must().add(qbSecond)
searchSourceBuilder.query(qb)
searchRequest.source(searchSourceBuilder)
SOMETHING1 和 SOMETHING2 代码块并不那么重要。
我的解决方案的问题是我无法指定 qbFirst
来考虑 ONLY index1 进行研究。不幸的是,它同时使用 index1 和 index2 (对于 qbSecond 也是如此)
有什么想法吗?
您需要做的是:
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
var q1: XXXBuilder = QueryBuilders.xxxQuery()
var q2: XXXBuilder = QueryBuilders.xxxQuery()
qb.must().add(QueryBuilders.indicesQuery(q1, "index1"))
qb.must().add(QueryBuilders.indicesQuery(q2, "index2"))
现在,由于 indices
查询已被 deprecated in ES 5 并在 ES 6 中删除,如果您升级,则需要搜索 _index
字段,这是这样的:
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
var q1: BoolQueryBuilder = QueryBuilders.boolQuery()
q1.must().add(QueryBuilders.termQuery("_index", "index1"))
q1.must().add(QueryBuilders.xxxQuery("SOMETHING1"))
var q2: BoolQueryBuilder = QueryBuilders.boolQuery()
q2.must().add(QueryBuilders.termQuery("_index", "index2"))
q2.must().add(QueryBuilders.xxxQuery("SOMETHING2"))
qb.must().add(q1)
qb.must().add(q2)
PS:另请注意,除非您有一个文档同时出现在两个索引中并满足两个条件,否则您应该使用 should
而不是 must
在顶级查询中。
我正在尝试将 elasticsearch 的这个多重 GET 操作转换为 Java/Kotlin 等效代码
curl "localhost:9200/index1, index2/_search?pretty=true" -d '{
"query" : {
"bool" : {
"must" : [
{
"indices" : {
"indices" : ["index1"],
"query" : {
SOMETHING1
}
}
},
{
"indices" : {
"indices" : ["index2"],
"query" : {
SOMETHING2
}
}
}
]
}
}
}'
我的解决方案是
val searchRequest = SearchRequest("index1", "index2")
val searchSourceBuilder = SearchSourceBuilder()
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
val qbFirst: BoolQueryBuilder = QueryBuilders.boolQuery()
qbFirst.must().add(SOMETHING1)
val qbSecond: BoolQueryBuilder = QueryBuilders.boolQuery()
qbSecond.must().add(SOMETHING2)
qb.must().add(qbFirst)
qb.must().add(qbSecond)
searchSourceBuilder.query(qb)
searchRequest.source(searchSourceBuilder)
SOMETHING1 和 SOMETHING2 代码块并不那么重要。
我的解决方案的问题是我无法指定 qbFirst
来考虑 ONLY index1 进行研究。不幸的是,它同时使用 index1 和 index2 (对于 qbSecond 也是如此)
有什么想法吗?
您需要做的是:
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
var q1: XXXBuilder = QueryBuilders.xxxQuery()
var q2: XXXBuilder = QueryBuilders.xxxQuery()
qb.must().add(QueryBuilders.indicesQuery(q1, "index1"))
qb.must().add(QueryBuilders.indicesQuery(q2, "index2"))
现在,由于 indices
查询已被 deprecated in ES 5 并在 ES 6 中删除,如果您升级,则需要搜索 _index
字段,这是这样的:
val qb: BoolQueryBuilder = QueryBuilders.boolQuery()
var q1: BoolQueryBuilder = QueryBuilders.boolQuery()
q1.must().add(QueryBuilders.termQuery("_index", "index1"))
q1.must().add(QueryBuilders.xxxQuery("SOMETHING1"))
var q2: BoolQueryBuilder = QueryBuilders.boolQuery()
q2.must().add(QueryBuilders.termQuery("_index", "index2"))
q2.must().add(QueryBuilders.xxxQuery("SOMETHING2"))
qb.must().add(q1)
qb.must().add(q2)
PS:另请注意,除非您有一个文档同时出现在两个索引中并满足两个条件,否则您应该使用 should
而不是 must
在顶级查询中。