作为参考,我使用的是ElasticSearch6.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
}
}
}
}
}
}
这个查询使用一个自定义函数score和一个过滤器来返回一个人可能喜欢的书(他们还没有写过)。问题是,对一些人来说,它返回的书的名字非常相似(即乔治华盛顿的生活,与乔治华盛顿的美好时光,谁是乔治华盛顿),我希望点击有一个更多样化的名称集。
我使用bucket\u选择器根据文本相似性聚合点击量,查询结果如下:
...,
"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或任何使用hits的语言来实现这一点,但我希望保持在es中。我尝试过使用bucket\u选择器聚合器,如下所示:
"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
计数是否已填写?
1条答案
按热度按时间368yc8dk1#
为什么不在聚合中使用top-hits来获取与bucket匹配的相关文档呢?您可以指定在top hits聚合中需要多少相关的top hits。所以基本上,这将为每个bucket提供一定数量的文档。