基于字段相似性的Elasticsearch过滤器

时间:2019-01-03 19:50:55

标签: elasticsearch elasticsearch-aggregation

作为参考,我正在使用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>

1 个答案:

答案 0 :(得分:0)

为什么不使用聚合内的热门搜索来获取与存储桶匹配的相关文档?您可以指定在“热门匹配”集合中希望获得多少相关的热门匹配。因此,基本上,这将为每个存储桶提供一定数量的文档。