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

如何通过所有多词搜索仅获取经过过滤的匹配结果。我有这个示例表,其中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过滤多个术语,仅包含匹配结果,而不包含任何匹配结果 的全部内容, 来源链接: utcz.com/qa/414495.html

回到顶部