嵌套字段类型在 Elasticsearch 中只会作为一个文档计数进行搜索。

huangapple go评论106阅读模式
英文:

Nested field type will only search as one doc count in elastic search

问题

我正在尝试使用AggregationBuilders按其客户名称聚合我的文档计数,因为我们有多个与单个文档关联的客户。我们使用嵌套字段client_name来索引和搜索文档。

以下是我的数据格式:

  1. {
  2. "id": "5f68c6c80f52a45a0db6d470",
  3. "name": "Mi Note 10 Lite",
  4. "brand": {
  5. "name": "xiaomi"
  6. },
  7. "client_name": [
  8. {
  9. "name": "client a"
  10. },
  11. {
  12. "name": "client b"
  13. }
  14. ]
  15. }

当我尝试使用聚合过滤器搜索客户a和b时,它只会返回一个文档计数:

  1. "aggregations": {
  2. "client a": {
  3. "doc_count": 1
  4. },
  5. "client b": {
  6. "doc_count": 0
  7. }
  8. }

我正在使用带有Elasticsearch 6.3的Java API。

以下是我的查询代码:

  1. boolQuery.should(new NestedQueryBuilder(CLIENT_NAME,
  2. QueryBuilders.termQuery(CLIENT_NAME + "." + NAME, token), ScoreMode.None));

这是我的AggregationBuilders.filter(k, v)

  1. AggregationBuilders.filter(k, v);

难道不应该在两个存储桶上都返回文档计数1吗?还是我漏掉了什么?

英文:

I am trying to use AggregationBuilders to aggregate my document count by its client name since we have multiple clients associated with a single doc. we are using the nested field client_name to index and search for a document.

Here is my data format

  1. {
  2. "id": "5f68c6c80f52a45a0db6d470",
  3. "name": "Mi Note 10 Lite",
  4. "brand": {
  5. "name": "xiaomi"
  6. },
  7. "client_name": [
  8. {
  9. "name": "client a"
  10. },
  11. {
  12. "name": "client b"
  13. }
  14. ]
  15. }

when I'm trying to search with aggregation filter for a client a and b, it will be only return one document count

  1. "aggregations": {
  2. "client a": {
  3. "doc_count": 1
  4. },
  5. "client b": {
  6. "doc_count": 0
  7. },
  8. }

I am using java API with elastic search 6.3.

here is my query code

  1. boolQuery.should(new NestedQueryBuilder(CLIENT_NAME,
  2. QueryBuilders
  3. .termQuery(CLIENT_NAME + "." + NAME, token),ScoreMode.None));

and here is my AggregationBuilders.filter(k,v);

should not aggregation bucket return doc count 1 on both bucket or am I missing something?

答案1

得分: 1

添加一个包含索引数据、映射、搜索结果和搜索查询的实际示例

索引映射:

  1. {
  2. "mappings": {
  3. "properties": {
  4. "client_name": {
  5. "type": "nested",
  6. "properties": {
  7. "name": {
  8. "type": "keyword"
  9. }
  10. }
  11. }
  12. }
  13. }
  14. }

索引数据:

  1. {
  2. "id": "5f68c6c80f52a45a0db6d470",
  3. "name": "Mi Note 10 Lite",
  4. "brand": {
  5. "name": "xiaomi"
  6. },
  7. "client_name": [
  8. {
  9. "name": "client a"
  10. },
  11. {
  12. "name": "client b"
  13. }
  14. ]
  15. }

搜索查询:

  1. {
  2. "size": 0,
  3. "aggs": {
  4. "client": {
  5. "nested": {
  6. "path": "client_name"
  7. },
  8. "aggs": {
  9. "client_count": {
  10. "terms": {
  11. "field": "client_name.name"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

搜索结果:

  1. "aggregations": {
  2. "client": {
  3. "doc_count": 2,
  4. "client_count": {
  5. "doc_count_error_upper_bound": 0,
  6. "sum_other_doc_count": 0,
  7. "buckets": [
  8. {
  9. "key": "client a",
  10. "doc_count": 1
  11. },
  12. {
  13. "key": "client b",
  14. "doc_count": 1
  15. }
  16. ]
  17. }
  18. }
  19. }

您可以参考此stackoverflow回答,将上述Elasticsearch查询转换为JAVA代码。

英文:

Adding a working example with index data, mapping, search result, and search query

Index Mapping:

  1. {
  2. "mappings": {
  3. "properties": {
  4. "client_name": {
  5. "type": "nested",
  6. "properties": {
  7. "name": {
  8. "type": "keyword"
  9. }
  10. }
  11. }
  12. }
  13. }
  14. }

Index Data:

  1. {
  2. "id": "5f68c6c80f52a45a0db6d470",
  3. "name": "Mi Note 10 Lite",
  4. "brand": {
  5. "name": "xiaomi"
  6. },
  7. "client_name": [
  8. {
  9. "name": "client a"
  10. },
  11. {
  12. "name": "client b"
  13. }
  14. ]
  15. }

Search Query:

  1. {
  2. "size" : 0,
  3. "aggs": {
  4. "client": {
  5. "nested": {
  6. "path": "client_name"
  7. },
  8. "aggs": {
  9. "client_count": {
  10. "terms": {
  11. "field": "client_name.name"
  12. }
  13. }
  14. }
  15. }
  16. }
  17. }

Search Result:

  1. "aggregations": {
  2. "client": {
  3. "doc_count": 2,
  4. "client_count": {
  5. "doc_count_error_upper_bound": 0,
  6. "sum_other_doc_count": 0,
  7. "buckets": [
  8. {
  9. "key": "client a",
  10. "doc_count": 1
  11. },
  12. {
  13. "key": "client b",
  14. "doc_count": 1
  15. }
  16. ]
  17. }
  18. }

You can refer this SO answer, to convert the above elasticsearch query to JAVA code.

huangapple
  • 本文由 发表于 2020年9月24日 15:45:53
  • 转载请务必保留本文链接:https://go.coder-hub.com/64041747.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定