当前位置: 首页 > 面试题库 >

Elasticsearch过滤多个术语,仅包含匹配结果,而不包含任何匹配结果

许庆
2023-03-14
问题内容

如何通过所有多词搜索仅获取经过过滤的匹配结果。我有这个示例表,其中titleid是一个映射int字段,personid是一个关键字:

titleid:1,personid:a
titleid:3,personid:a

titleid:1,personid:b
titleid:2,personid:b

titleid:1,personid:c
titleid:5,personid:c

删除结果为:

titleid:1

使用这样的示例查询:

{query:
    {bool:
    {filter:
            {must:[
                    {terms : {fields: {personid:[a,b,c]}}
                 ]
            }}}}

我得到以下结果:

titleid: 1,2,3,5

也许这会有所帮助,我在sql中进行了查询并获得了预期的结果。我所做的是让查询给我与搜索到的参数数量匹配的titleid之和。这只是为了更多地自我解释,其思想是使用elasticsearch

select titleid
from (
   select count(titleid) as title_count, titleid 
   from table1 
   where personid in ('a','b','c')
   group by titleid
) as vw 
where title_count = 3

问题答案:

如果只希望使用titleid == 1AND 记录,则personid == 'a'可以在两个字段上进行过滤。只有布尔查询使用mustshouldmost_not。使用过滤器,因为它按照定义进行过滤(例如删除),因此must

"query": {
  "bool": {
    "filter": [
      {
        "term": {
          "titleId": { "value": 1 }
        } 
      },
      {
        "term": {
          "personid": { "value": "a" }
        }
      }
    ]
  }
}

更新::

现在,您的问题看起来像是要过滤和汇总结果,然后对这些结果进行汇总。有一些指标和存储桶聚合

使用存储桶选择器聚合 (未经测试,但如果不正确,则应该非常接近)

{
    "aggs" : {
        "title_id" : {
            "filter" : { "terms": { "personid": ["a","b","c"] } },
            "aggs" : {
                "id_count" : { "count" : { "field" : "titleid" } }
            }
        },      
        aggs": {
            "count_filter": {
               "bucket_selector": {
                  "buckets_path": {
                     "the_doc_count": "_count"
                  },
                  "script": "the_doc_count == 3"
               }
            }
         }  
    }
}

但是,请注意,管道聚合将对其他聚合产生的输出起作用,因此计算初始doc_counts所需完成的工作总量将是相同的。由于需要为每个输入存储桶执行脚本部分,因此对于高基数字段,操作可能会很慢,如成千上万的术语。



 类似资料:
  • 如何使elasticsearch查询返回没有_internal字段的结果,如_index、_type? 原因:对于几个页面,我使用AJAX调用来获取结果,而不是在服务器上呈现整个网页。但是为每个文档公开_index&_type内部字段不仅是冗余的(带宽),而且还暴露了索引和类型名称(安全问题)。 请救命!

  • 我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:

  • 问题内容: 我有一个对象映射,它以类似标签的方式使用嵌套对象(在我们的示例中)。每个标签可以属于一个客户/用户,并且当我们要允许我们的用户针对生成样式搜索时。 问题是,当我们运行查询时,如果一个对象有多个道具,并且当其他道具不返回时,如果多个道具之一与过滤器匹配,则当我们想要相反时- 如果一个道具返回false,则不返回vs。如果返回true,则返回true。 我在这里发布了一个完整的示例:htt

  • 我正在为我的 REST API 控制器编写测试,我需要检查返回的 对象中的 值,请参阅此测试方法: 但是测试产生了这个错误: 似乎ID被正确返回,但被序列化为不同的结构。 我的代码有什么问题?

  • 问题内容: 我所有的文档都有一个带有ID 的字段,该ID将文档链接到用户。有多个文档相同。 我想对所有文档执行搜索,每个文档仅返回得分最高的文档。 选择相关文档的查询是一个简单的查询。 问题答案: 您需要一个汇总。 对于您的具体情况: 上面的查询会执行您的查询并基于汇总结果。对于每个uid存储桶,它仅返回一个结果,但是在存储桶中的所有文档都按照后代顺序排序之后。

  • 当我通过一个特定方面进行过滤时,该特定字段的方面在结果中被正确过滤,但其他方面的字段保持不变。解释这一点的最佳方法是使用查询和响应。 因此,如您所见,它返回所有方面,即使唯一的结果位于Eugene。它还返回的计数7。为什么它会返回所有这些额外的方面和错误的计数?下面是我的ruby映射。