当前位置: 首页 > 知识库问答 >
问题:

基于字段相似性的弹性搜索滤波器

丁鹏鹍
2023-03-14

作为参考,我使用的是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_sampledoc_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不能转换为org.elasticsearch.search.aggregations.InternalMultiBucketAggregation

此外,如果该过滤器删除了足够多的文档,使得命中计数小于请求的大小,是否可以告诉es去获取下一个最高得分的命中,以便填写< code>hits计数?

共有1个答案

郭兴平
2023-03-14

为什么不在聚合中使用tophits来获取与bucket匹配的相关文档?您可以指定在热门点击聚合中需要多少相关热门点击。基本上,这将为每个存储桶提供一定数量的文档。

 类似资料:
  • 我对Elasticsearch相当陌生,所以这是我的问题。我想用elasticsearch做一个搜索查询,想用多个术语过滤。 如果我想搜索用户'Tom',那么我希望获得用户'is active=1'、'is private=0'和'is owner=1'的所有匹配项。 这是我的搜索查询 谢谢你的帮助!!

  • 我有一个关于书籍的数据集,每本书都可以是一种或多种语言的。每个用户都注册为拥有一种或多种语言。 当用户搜索书籍时,我只想返回那些他们理解所有语言的书籍。 例如,系统中有以下两本书: 如果John被注册为懂英语、德语、法语和意大利语,那么他的查询结果永远不应该包括Book B。 我的系统目前是使用Apache Solr编写的,最后我编写了一个插件来执行子集操作(如果记录的语言是用户语言的子集,则该记

  • 我有一份这样的文件 下面是我到目前为止所尝试的

  • 我有一堆像下面这样的文件。我想过滤projectkey以~开头的数据。我确实读过一些文章,其中说~是弹性查询中的一个运算符,因此无法真正使用它进行过滤。有人能帮你建立搜索查询/branch/u搜索API吗?? 更新*** 我在下面使用prerana的答案在我的查询中使用-prefix 当我使用前缀和范围时仍然有问题-我得到以下错误-我缺少什么??

  • 我正在开发JSF项目并将Elastic Search与本机JavaApi(不是Jest)一起使用。我在elasticsearch索引映射中为高级全文搜索定义了分析器和nGram过滤器。如何使用java api进行此查询定义?

  • 我试图从弹性搜索集群中获取数据。索引名称:testIndex类型:testType主机:localhost端口:8080 我想使用弹性搜索5.4版本,使用RestClient,我想使用多重匹配查询获取数据。 示例查询如下所示。 最好的方法是什么?我是否可以使用QueryBuilder构建查询并将其用于rest客户端。