基于场相似性的ElasticSearch滤波器

ejk8hzay  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(378)

作为参考,我使用的是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 计数是否已填写?

368yc8dk

368yc8dk1#

为什么不在聚合中使用top-hits来获取与bucket匹配的相关文档呢?您可以指定在top hits聚合中需要多少相关的top hits。所以基本上,这将为每个bucket提供一定数量的文档。

相关问题