簡體   English   中英

基於字段相似性的Elasticsearch過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM