关于elasticsearch的terms查询超过最大terms数

当我使用es的terms查询时,报错了这段内容。

failed to create query: The number of terms [80306] used in the Terms
Query request has exceeded the allowed maximum of [65536]. This
maximum can be set by changing the [index.max_terms_count] index level
setting.

根据资料,这是es对terms的数量限制。最高限制为65536,。在这里插入图片描述
在这里插入图片描述

要解决这个问题,我研究了两种方法:

  1. 改变最大terms数量
curl --location --request PUT 'xxxxx/_settings' \
--header 'User-Agent: Apipost client Runtime/+https://www.apipost.cn/' \
--header 'Content-Type: application/json' \
--data '{
  "index.max_terms_count": 262144
}'

在这里插入图片描述

  1. 将单个terms分为多个terms,按照max_terms_count的数量,将terms的值数组切成多个数组,通过should的方式拼起来进行查询。

总结:
目前我用的这两种方法都可以实现同样的效果,当前我使用的数组长度大约是8w个,在查询速度上两个的速度基本相同。

参考资料:

  1. Terms query
  2. Elasticsearch Query DSL之Term level queries
  3. 第三章 Elasticsearch基础搜索(一)
### 回答1: 下面是一个示例代码,可以帮助您生成Elasticsearch查询:GET http://localhost:9200/my_index/_search { "query": { "terms": { "field_name": ["value1", "value2"] } } } ### 回答2: 当使用ElasticsearchTerms查询时,您可以使用以下代码来生成查询: ```java import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.terms.Terms; RestHighLevelClient client = new RestHighLevelClient(/* Elasticsearch连接配置 */); // 创建Terms聚合查询 SearchRequest searchRequest = new SearchRequest("your_index_name"); // 替换为您的索引名称 SearchSourceBuilder searchSource = new SearchSourceBuilder(); TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("your_aggregation_name") // 替换为您指定的聚合名称 .field("your_field_name") // 替换为您指定的字段名称 .size(10); // 替换为您想要的聚合结果量 searchSource.aggregation(termsAggregationBuilder); searchRequest.source(searchSource); try { SearchResponse searchResponse = client.search(searchRequest); // 解析聚合结果 Terms terms = searchResponse.getAggregations().get("your_aggregation_name"); // 使用您指定的聚合名称 for (Terms.Bucket bucket : terms.getBuckets()) { String key = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); System.out.println("Key: " + key + ", DocCount: " + docCount); } } catch (Exception e) { e.printStackTrace(); } finally { try { client.close(); } catch (Exception e) { e.printStackTrace(); } } ``` 请注意,上述代码仅为示例,并且需要根据您的实际情况进行相应的替换。其中,需替换的部分包括:your_index_name(您的索引名称)、your_field_name(您的字段名称)、your_aggregation_name(您的聚合名称)。 此代码将创建一个Terms聚合查询,并返回您指定字段的聚合结果。您可以通过迭代聚合桶来访问每个聚合的键值和文档量。 记得在程序结束时关闭Elasticsearch的连接。 ### 回答3: 当使用Elasticsearchterms查询时,可以通过以下代码生成查询语句: ```java import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermsQueryBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.search.SearchHit; // 创建terms查询 public void generateTermsQuery(RestHighLevelClient client, String indexName, String fieldName, String[] terms) { TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(fieldName, terms); // 创建搜索请求 SearchRequest searchRequest = new SearchRequest(indexName); searchRequest.source().query(termsQuery); try { // 执行搜索 SearchResponse searchResponse = client.search(searchRequest); // 处理搜索结果 SearchHit[] hits = searchResponse.getHits().getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } } catch (IOException e) { e.printStackTrace(); } } ``` 这段代码使用了Elasticsearch的Java高级客户端(RestHighLevelClient)来与Elasticsearch进行交互。首先,我们创建了一个TermsQueryBuilder对象来构建terms查询,其中fieldName是要匹配的字段名,terms是要匹配的词语组。 然后,我们创建一个SearchRequest对象,并将terms查询添加到搜索请求的查询源中。接下来,我们使用RestHighLevelClient执行搜索,并通过SearchResponse获取搜索结果。 最后,我们遍历搜索结果的每个SearchHit对象,并打印其源据(hit.getSourceAsString())。 请注意,这只是一个示例代码,你需要根据自己的具体需求进行调整。你还需要根据实际情况创建和配置Elasticsearch的RestHighLevelClient对象,并传递给generateTermsQuery方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值