Elasticsearch terms查询

terms 查询


只要有被提供的字段值(未被分析)被文档匹配,该文档将会被此terms查询匹配。

GET /_search
{
    "query": {
        "terms" : { "user" : ["kimchy", "elasticsearch"]}
    }
}

高亮terms查询只会尽力,根据所选择的高亮器的实现以及terms查询中字段值的数量,terms查询中的字段值可能不会被高亮。

1 字段值查找机制

当需要指定具有大量字段值的terms过滤器时,从索引中的文档中获取这些字段值将会非常有用。一个具体的例子就是用于过滤粉丝发送的推文。可能会在字段值过滤器中指定大量的用户id,在这种情况下,使用字段值过滤器查找机制就极为重要。

字段值查找机制支持以下选项:

  • index:从中获取字段值的索引
  • type:从中获取字段值的类型
  • id:从中获取字段值的文档的id
  • path:设置为用于为terms过滤器获取确切值的路径的字段
  • routing:当检索外部字段值文档时,需要使用自定义路由值

terms过滤器的值将会从由指定索引的指定类型的指定id确定的文档的字段中获取。在内部,需要执行获取请求来从指定路径获取值。此特性运行时,需要保证_source被存储。

如果“引用”字段值数据并不多,考虑使用具有单切片且跨所有节点备份的索引。查找字段值过滤器倾向于在本地节点上执行获取请求,尽量减少网络的使用。

执行具有大量字段值的terms查询将会非常缓慢,因为每个附加的字段值都需要额外的处理与内存。为了防止这一情况的发生,用于terms查询的字段值的最大数量(无论是直接指定的还是通过查找机制获取的)被限制为65536。对于特定索引,可以通过索引设置index.max_terms_count改变这一默认值。

2 案例:使用查找机制
PUT /users/_doc/2
{
    "followers" : ["1", "3"]
}

PUT /tweets/_doc/1
{
    "user" : "1"
}

note:设置user2的粉丝为user1与user3。

GET /tweets/_search
{
    "query" : {
        "terms" : {
            "user" : {
                "index" : "users",
                "type" : "_doc",
                "id" : "2",
                "path" : "followers"
            }
        }
    }
}

note:搜索user2的粉丝。

从文档查找获取terms查询所需的字段值,也可以从指定文档的内部对象的数组的指定字段中获取。

PUT /users/_doc/2
{
 "followers" : [
   {
     "id" : "1"
   },
   {
     "id" : "2"
   }
 ]
}

note:查找路径设置为followers.id即可。

翻译源:Elasticsearch 6.4 文档

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答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方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值