2017-10-10 189 views
0

嗨,朋友我想在我的网站做一个搜索栏。我有数以千计的公司文章。当我运行这段代码:Elasticsearch聚合和过滤器

GET articles/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "assistant", 
      "fields": ["title"] 
      } 
     } 
     ] 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company.keyword", 
     "size": 10 
     } 
    } 
    } 
} 

结果是:所以现在

"aggregations": { 
"by_company": { 
    "doc_count_error_upper_bound": 5, 
    "sum_other_doc_count": 409, 
    "buckets": [ 
    { 
     "key": "University of Miami", 
     "doc_count": 6 
    }, 
    { 
     "key": "Brigham & Women's Hospital(BWH)", 
     "doc_count": 4 
    }, 

我想迈阿密大学的过滤器的文章使我运行下面的查询:

GET indeed_psql/job/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "assistant", 
      "fields": ["title"] 
      } 
     } 
     ], 
     "filter": { 
     "term": { 
      "company.keyword": "University of Miami" 
     } 
     } 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "by_company": { 
     "terms": { 
     "field": "company.keyword", 
     "size": 10 
     } 
    } 
    } 
} 

但现在结果是:

"aggregations": { 
    "by_company": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "University of Miami", 
      "doc_count": 7 
     } 
     ] 
    } 

为什么在以前的聚合中突然有7个是6?其他大学过滤器也会发生这种情况。我究竟做错了什么 ?我没有使用标准的标记语言,并使用english_stemmer,english_stopwords,english_keywords。谢谢你的帮助。

回答

1

您的第一个查询文档很可能是错误的。在第一个响应中,“doc_count_error_upper_bound”为5,这意味着返回聚合中的某些术语不会作为每个底层查询分片中的最佳结果。文件计数总是太低而不是太高,因为在查询前N个键的分片的过程中,它可能已被“错过”。

你有多少片碎片?例如,如果有3个碎片,和你的聚合大小为3,你的分发文件是这样的:

 
Shard 1  Shard 2  Shard 3 
3 BYU  3 UMiami 3 UMiami 
2 UMich  2 BWH  2 UMich 
2 MGH  2 UMich  1 BWH 
1 UMiami  1 MGH  1 BYU 

,您的最终从每个碎片前3项合并为:

 
6 UMiami // returned 
6 UMich // returned 
3 BWH // returned 
3 BYU 
2 MGH 

从中,只返回前三个结果。几乎所有这些键都被低估了。

你可以看到在这种情况下,Shard 1中的UMiami文档不会考虑它,因为它超出了3的深度。但是如果你过滤只看UMiami,你必然会退回任何关联的文档在每个分片中,并以精确的计数结束。

你可以玩shard_size参数,这样Elasticsearch看起来更深入每个分片也得到更近似的计数。但鉴于此方面共有7个文档,可能在您的一个分片中只有一个文档发生,因此如果没有获取该分片的所有文档,将很难将其显示在顶部聚合中。

您可以阅读更多关于计数近似值和误差推导的信息here - tldr,Elasticsearch根据每个单独分片中的最高聚合情况猜测该分面的文档总数。

+0

谢谢你。你保存了一天:) –