作为参考,我正在使用Elasticsearch 6.4.0
我有一个Elasticsearch查询,该查询返回一定数量的匹配,并且我试图删除文本字段值过于相似的匹配。我的查询是:
{
"size": 10,
"collapse": {
"field": "author_id"
},
"query": {
"function_score": {
"boost_mode": "replace",
"score_mode": "avg",
"functions": [
{
//my custom query function
}
],
"query": {
"bool": {
"must_not": [
{
"term": {
"author_id": MY_ID
}
}
]
}
}
}
},
"aggs": {
"book_name_sample": {
"sampler": {
"shard_size": 10
},
"aggs": {
"frequent_words": {
"significant_text": {
"field": "book_name",
"filter_duplicate_text": true
}
}
}
}
}
}
此查询将自定义功能评分与过滤器结合使用,以返回某人可能喜欢的书(他们尚未创作)。对于某些人来说,它返回的书名非常相似(例如,《乔治华盛顿的一生》,《与乔治华盛顿的美好时光》,《乔治华盛顿》),我希望这些畅销书能够提供更多样化的名称。
我正在使用bucket_selector来基于文本相似性来汇总匹配,而查询显示的内容如下:
...,
"aggregations": {
"book_name_sample": {
"doc_count": 10,
"frequent_words": {
"doc_count": 10,
"bg_count": 482626,
"buckets": [
{
"key": "George",
"doc_count": 3,
"score": 17.278715785140975,
"bg_count": 9718
},
{
"key": "Washington",
"doc_count": 3,
"score": 15.312204414323656,
"bg_count": 10919
}
]
}
}
}
是否可以在Elasticsearch中基于此聚合结果过滤返回的文档? IE删除book_name_sample doc_count
少于X的匹配吗?我知道我可以用PHP或任何使用流行歌曲的语言来做到这一点,但我想将其保留在ES中。我已经尝试过使用bucket_selector聚合器,如下所示:
"book_name_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"freqWords": "frequent_words"
},
"script": "params.freqWords < 3"
}
}
但随后出现错误:org.elasticsearch.search.aggregations.bucket.sampler.InternalSampler cannot be cast to org.elasticsearch.search.aggregations.InternalMultiBucketAggregation
此外,如果该过滤器删除了足够的文档,以使命中计数小于请求的大小,是否可以告诉ES去获取下一个最高得分的命中,以便填写hits
计数? / p>
答案 0 :(得分:0)
为什么不使用聚合内的热门搜索来获取与存储桶匹配的相关文档?您可以指定在“热门匹配”集合中希望获得多少相关的热门匹配。因此,基本上,这将为每个存储桶提供一定数量的文档。