elasticsearch - 如何结合“AND”和“OR”查询以获得两者的结果?
问题描述
我正在尝试使用一个查询来获取两个查询的结果。
我必须为每个多字字符串查询请求运行两个查询,然后以编程方式将结果组合到我觉得不合适的代码中。
其中一个查询使用AND
运算符,其中一个使用OR
运算符。
这是第一个查询:
GET my_index/_search
{
"query": {
"bool": {
"must_not": [
{"exists": {"field": "deleted"}}
],
"must": [
{
"multi_match": {
"query": "refuse eating",
"fields": [
"title^3",
"desc^2",
"body"
],
"type": "best_fields",
"operator": "AND"
}
}
],
"filter": [
{"term": {"kind": "article"}},
{"term": {"status": "published"}}
]
}
}
}
这是第二个查询:
GET my_index/_search
{
"query": {
"bool": {
"must_not": [
{"exists": {"field": "deleted"}}
],
"must": [
{
"multi_match": {
"query": "refuse eating",
"fields": [
"title^3",
"desc^2",
"body"
],
"type": "best_fields",
"operator": "OR"
}
}
],
"filter": [
{"term": {"kind": "article"}},
{"term": {"status": "published"}}
]
}
}
}
想法是在顶部AND
获取第一个查询(使用运算符的查询)的结果,然后在第一个结果下方获取第二个查询(使用运算符的查询)的结果。OR
有没有办法用一个查询而不是两个来实现这一点?
解决方案
您可能可以利用bool/should
更高的boost
因素进行 AND 匹配:
GET my_index/_search
{
"query": {
"bool": {
"must_not": [
{
"exists": {
"field": "deleted"
}
}
],
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"query": "refuse eating",
"fields": [
"title^3",
"desc^2",
"body"
],
"type": "best_fields",
"operator": "AND",
"boost": 2, <--- boost AND by 2 (or more)
"_name": "and-match"
}
},
{
"multi_match": {
"query": "refuse eating",
"fields": [
"title^3",
"desc^2",
"body"
],
"type": "best_fields",
"operator": "OR",
"_name": "or-match"
}
}
],
"filter": [
{
"term": {
"kind": "article"
}
},
{
"term": {
"status": "published"
}
}
]
}
}
}
推荐阅读
- javascript - 将对象数组转换为具有唯一 ID 和名称数组的另一个对象数组
- powerbi - 前 N 个月同期
- dax - PBI DAX 比较两个不同表中的两行
- firebase - 获取具有等于flutter中特定字符串的字段的Firestore文档
- python - Dask 图:按层为任务着色
- c# - 如何在 c# winforms 应用程序中使用 DirectX 录制全屏游戏?
- scala - 如何运行 12 个月的滚动窗口来识别系统中的用户
- multithreading - GraphQL .NET FieldResolver 在每个异步 http 请求上都失败
- javascript - 谷歌地图不可见,因为动态值显示未定义
- javascript - 导出到 SheetJs 错误中的现有 xlsx 文件