gpt4 book ai didi

elasticsearch - 添加过滤器似乎会产生更多结果

转载 作者:行者123 更新时间:2023-12-03 01:30:13 24 4
gpt4 key购买 nike

涉及将过滤器添加到现有 bool(boolean) 查询的奇怪情况。

此查询在这里仅显示一个结果,即“pages”索引中的一个结果。
可以预料,在我们这边的“文档”索引对于此查询的结果是非常有用的。

这很有道理。此版本的查询工作正常。

{
"index": "pages"
}
{
"size": 30,
"query": {
"dis_max": {
"queries": {
"bool": {
"should": [
{
"term": {
"title_exact": "\"this is a test search phrase\""
}
},
{
"query_string": {
"fields": [
"title"
],
"query": "\"this is a test search phrase\""
}
},
{
"nested": {
"path": "versions",
"query": {
"query_string": {
"fields": [
"versions.page_content"
],
"query": "\"this is a test search phrase\""
}
}
}
}
]
}
}
}
}
}
{
"index": "documents"
}
{
"size": 30,
"query": {
"dis_max": {
"queries": {
"bool": {
"should": [
{
"term": {
"title_exact": "\"this is a test search phrase\""
}
},
{
"query_string": {
"fields": [
"title"
],
"query": "\"this is a test search phrase\""
}
},
{
"nested": {
"path": "product.versions",
"query": {
"query_string": {
"fields": [
"versions.page_content"
],
"query": "\"this is a test search phrase\""
}
}
}
}
]
}
}
}
}
}


但是,用户可以为现有查询添加过滤器,在这种情况下,这就是产品。

这是发送的查询。
{
"index": "pages"
}
{
"size": 30,
"query": {
"dis_max": {
"queries": {
"bool": {
"should": [
{
"term": {
"title_exact": "\"this is a test search phrase\""
}
},
{
"query_string": {
"fields": [
"title"
],
"query": "\"this is a test search phrase\""
}
},
{
"nested": {
"path": "versions",
"query": {
"query_string": {
"fields": [
"versions.page_content"
],
"query": "\"this is a test search phrase\""
}
}
}
}
],
"filter": [
{
"term": {
"product_id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
}
}
]
}
}
}
}
}
{
"index": "documents"
}
{
"size": 30,
"query": {
"dis_max": {
"queries": {
"bool": {
"should": [
{
"term": {
"title_exact": "\"this is a test search phrase\""
}
},
{
"query_string": {
"fields": [
"title"
],
"query": "\"this is a test search phrase\""
}
},
{
"nested": {
"path": "product.versions",
"query": {
"query_string": {
"fields": [
"versions.page_content"
],
"query": "\"this is a test search phrase\""
}
}
}
}
],
"filter": [
{
"term": {
"product.id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
}
}
]
}
}
}
}
}


这里的问题是,尽管“页面”索引仍会按需生成一个结果,但“文档”索引现在会突然与其中包含该产品ID的每条记录匹配,从而提高结果。

在这种情况下,“过滤器”和“必须”都执行相同的操作。

老实说,它应该产生与上一个查询完全相同的结果。筛选器应仅减少结果集,而不能增加结果集。

谁有想法?

谢谢

最佳答案



在您的bool查询中添加minimum-should-match,以告诉查询仅在至少X子句的should数目匹配时才返回文档。似乎默认值是0,这就是为什么结果基于filter查询,而should只是分配scoring的原因。

添加minimum-should-match后查询:

{
"index": "documents"
}
{
"size": 30,
"query": {
"dis_max": {
"queries": {
"bool": {
"should": [
{
"term": {
"title_exact": "\"this is a test search phrase\""
}
},
{
"query_string": {
"fields": [
"title"
],
"query": "\"this is a test search phrase\""
}
},
{
"nested": {
"path": "product.versions",
"query": {
"query_string": {
"fields": [
"versions.page_content"
],
"query": "\"this is a test search phrase\""
}
}
}
}
],
"filter": [
{
"term": {
"product.id": "a2c2c792-84ac-11e8-b4c6-005056a40c60"
}
}
],
"minimum_should_match": 1
}
}
}
}
}

问题

简要说明如下:
  • filter-仅过滤文档,与scoring无关
  • should-如果匹配,则贡献给scoring。但是minimum-should-match将更改应如何返回文档。
  • must-过滤文档并贡献给scoring

  • Bool query doc

    在第二个 document查询中,总匹配数是基于 filter子句的,而 should子句只会将 scoring分配给匹配的文档,而不会减少结果,因为 minimum-should-match是(可能是默认值) 0

    关于elasticsearch - 添加过滤器似乎会产生更多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403134/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com