首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字段相似度的Elasticsearch过滤器

问基于字段相似度的Elasticsearch过滤器
EN

Stack Overflow用户
提问于 2019-01-04 03:50:55
回答 1查看 266关注 0票数 0

作为参考,我使用的是Elasticsearch 6.4.0

我有一个Elasticsearch查询,它返回一定数量的匹配项,并且我试图删除文本字段值过于相似的匹配项。我的问题是:

代码语言:javascript
复制
{
  "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_selector根据文本相似度聚合命中结果,查询结果如下所示:

代码语言:javascript
复制
...,
"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_selector聚合器,如下所示:

代码语言:javascript
复制
"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计数?

EN

回答 1

Stack Overflow用户

发布于 2019-01-12 12:40:33

为什么不在聚合中使用top命中来获取与存储桶匹配的相关文档呢?您可以指定希望在top点击数聚合中包含多少相关的top点击数。基本上,这将为每个存储桶提供一定数量的文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54028894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档