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

elasticsearch bool查询组合必须与或

锺星腾
2023-03-14

我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。

我有这个lucene查询

(( 
    name:(+foo +bar) 
    OR info:(+foo +bar) 
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)

根据我的理解,这是一个必须子句与布尔OR结合的组合:

“获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。”

我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "foo"
          }
        },
        {
          "match": {
            "name": "bar"
          }
        }
      ],
      "must_not": [],
      "should": [
        {
          "match": {
            "has_image": {
              "query": 1,
              "boost": 100
            }
          }
        }
      ]
    }
  }
}

如您所见,缺少“info”的必须条件。

有人有解决办法吗?

太感谢你了。

**更新**

我已经更新了我的elasticsearch查询,并且去掉了那个函数分数。我的基地问题仍然存在。

共有2个答案

郭鸿信
2023-03-14

我最终创建了一个查询,该查询完全符合我的要求:

筛选的嵌套布尔查询。我不确定为什么这没有记录在案。也许这里有人能告诉我?

以下是查询:

GET /test/object/_search
{
  "from": 0,
  "size": 20,
  "sort": {
    "_score": "desc"
  },
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "state": 1
              }
            }
          ]
        }
      },
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "name": "foo"
                    }
                  },
                  {
                    "match": {
                      "name": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "match": {
                      "info": "foo"
                    }
                  },
                  {
                    "match": {
                      "info": "bar"
                    }
                  }
                ],
                "should": [
                  {
                    "match": {
                      "has_image": {
                        "query": 1,
                        "boost": 100
                      }
                    }
                  }
                ]
              }
            }
          ],
          "minimum_should_match": 1
        }
      }    
    }
  }
}

在伪SQL中:

SELECT * FROM /test/object
WHERE 
    ((name=foo AND name=bar) OR (info=foo AND info=bar))
AND state=1

请记住,内部如何处理name=foo取决于您的文档字段分析和映射。这可以从模糊到严格的行为。

“minimum_should_match”:1表示至少有一个should语句必须为真。

这些语句意味着,只要resultset中有一个包含has_image:1的文档,它就会增加因子100。这将更改结果顺序。

"should": [
  {
    "match": {
      "has_image": {
        "query": 1,
        "boost": 100
      }
    }
   }
 ]

玩得开心的家伙:)

弘康安
2023-03-14
  • 或拼写为should
  • 并且拼写为必须
  • NOR拼写为should_not

示例:

您希望看到所有的项目(圆形和(红色或蓝色)):

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {"shape": "round"}
                },
                {
                    "bool": {
                        "should": [
                            {"term": {"color": "red"}},
                            {"term": {"color": "blue"}}
                        ]
                    }
                }
            ]
        }
    }
}

您还可以执行OR的更复杂版本,例如,如果您希望至少匹配5个选项中的3个,您可以在“should”下指定5个选项,并将“minimum_should”设置为3。

感谢Glen Thompson和Sebastialonso找到了我之前不太合适的筑巢位置。

还要感谢Fatmajk指出在ElasticSearch 6中“term”变成了“match”。

 类似资料:
  • 问题内容: 我目前正在尝试将基于Solr的应用程序迁移到Elasticsearch。 我有这个lucene查询 据我了解,这是MUST子句与布尔OR的组合: “获取所有包含(名称中包含foo AND条)或(信息中包含foo AND条)的所有文档。在此之后,按条件state = 1过滤结果,并增强具有图像的文档。” 我一直在尝试将布尔查询与MUST一起使用,但是我无法将布尔OR放入must子句中。这

  • 基本上,我有一组顶点ID,我想遍历并从某些外边找到一组顶点。我想把外边后面的顶点与它来自的准确性联系起来。例如:,所以v1有2个输出边(e1和e2)到v2和v4,而v3有2个输出边(e3和e4)到v5和v6。我想要的是得到如下所示的遍历结果 有人能帮我使用Gremlin遍历吗?最接近的例子是

  • 如何用UNION操作符将多条SELECT语句组合成一个查询 组合查询 并(union) 执行多个查询并将结果作为单个查询结果返回。 一般需要使用组合查询的情况 单个查询中从不同的表类似返回结果数据 单个表执行多个查询,按单个查询返回数据 创建组合查询 检索 IL,IN,MI几个洲的客户报表。 mysql> SELECT cust_name, cust_contact, cust_email

  • 如何对同一嵌套下的多个字段执行“必须”“匹配”查询?这是一个可复制的ES索引,其中“用户”字段定义为“嵌套”类型。 这里有2份文件: 对于这个索引,如何查询“John”和“Alice”都存在的文档?使用上面定义的索引,我希望得到的是文档1,而不是文档2。到目前为止,我已经尝试了以下代码,但没有收到任何结果:

  • 除了查询之外,两者的提取看起来完全相同: 第一个查询返回:  但第二个查询返回错误: 但我得到了同样的错误

  • 我想它一定是在请求体。我如何发送‘更新’查询或我做错了?