我正在寻找类似“在” SQL查询语言中的命令,但在 Elasticsearch 查询中
我已经写过这样的东西,我想知道如何传递messageThreadIds列表,而不只是特定的值!
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
queryBuilder.must(QueryBuilders.queryStringQuery("messageThread:\"" + messageThreadId + "\""));
queryBuilder.must(QueryBuilders.queryStringQuery("isDeleted:false"));
queryBuilder.mustNot(QueryBuilders.queryStringQuery("excludedUsers:\"" + receiverUserId + "\""));
queryBuilder.mustNot(QueryBuilders.queryStringQuery("sender:\"" + receiverUserId + "\""));
if (sendTime != null) {
if (sendTimeNanos != null) {
queryBuilder.must(QueryBuilders.queryStringQuery(
"sendTime:>" + sendTime +
" OR (sendTime: " + sendTime + " AND sendTimeNanos:>" + sendTimeNanos + ")")
);
} else {
queryBuilder.must(QueryBuilders.queryStringQuery("sendTime:>" + sendTime));
}
}
SearchResponse response = transportClient.prepareSearch(ChatSettings.ELASTIC_MESSAGE_INDEX_NAME + "*")
.setTypes(ChatSettings.ELASTIC_DB_NAME)
.setSearchType(SearchType.DEFAULT)
.setQuery(queryBuilder)
.setFetchSource(new String[]{"id"}, null)
.addAggregation(AggregationBuilders.count("count").field("id"))
.setSize(1)
.setExplain(true)
.execute()
.actionGet();
checkResponse(response);
InternalValueCount count = response.getAggregations().get("count");
return response.getHits().getTotalHits() > 0 ? count.getValue() : null;
例如:对于messageThreadId = 1020,它将返回5作为答案,对于messageThreadId = 1030,在这种情况下没有答案,因此我得到的是null。对于messageThreadId = 1040,它将返回20作为答案及其正确值。但是我想要一个查询,该查询发送了messageThreadIds列表[1020,1030,1040]并得到25作为答案。但是当我将messageThreadId条件查询更改为
queryBuilder.must(QueryBuilders.termsQuery(“messageThread”,messageThreadIdList));
它将返回null作为答案!
有没有一种方法可以查询我的目标?
最佳答案
您基本上想将多个字词与您的数据匹配,因此您可以对相同的字词查询。
GET <index_name>/_search
{
"query" : {
"terms" : {
"messageThread" : ["messageThread1", "messageThread2"]
}
}
}
您可以使用
//it can accept a collection
List<String> messageTgreads;
QueryBuilders.termsQuery("messageThread", messageTgreads)
并根据您使用的客户端,可以相应地触发查询。
关于sql - 使用Elastic查询中的值列表检查字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60165709/