[英]Elasticsearch filter based on field similarity
供參考,我使用的是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的book_name_sample doc_count
? 我知道我可以用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
數?
為什么不使用聚合中的熱門條目來獲取與存儲桶匹配的相關文檔? 您可以指定在“熱門匹配”集合中希望獲得多少相關的熱門匹配。 因此,基本上,這將為每個存儲桶提供一定數量的文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.