sql - 使用Elastic查询中的值列表检查字段的值

标签 sql elasticsearch

我正在寻找类似“在” 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/

相关文章:

sql - PostgreSQL 插入触发器和多对多表

sql - linq 在两列上不同并作为单个字段返回

elasticsearch - Elasticsearch 插件可以有多个 Module 功能吗

elasticsearch - 有没有办法知道 Elasticsearch 中键的数据类型?

elasticsearch - 分析器是否会阻止字段突出显示?

php - 查询从其他表中获取相应的用户 ID

sql - PostgreSQL if 查询?

android - 连接到网站 sql 数据库并在 android 上显示网页内容

elasticsearch - 分片(Elasticsearch)是否有自己的JVM设置

elasticsearch - FSCrawler找不到现有工作