热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

elasticsearchboolquery必须与OR结合使用

如何解决《elasticsearchboolquery必须与OR结合使用》经验,为你挑选了3个好方法。

我目前正在尝试将基于solr的应用程序迁移到elasticsearch.

我有这个lucene查询

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

据我所知,这是MUST子句与布尔OR组合的组合:

"获取包含(foo AND bar in name)OR(foo AND bar in info)的所有文档.之后过滤条件状态= 1,并提升具有图像的文档."

我一直试图使用一个bool查询,但我没有得到boolean OR到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
            }
          }
        }
      ]
    }
  }
}

如您所见,缺少"信息"的必须条件.

有没有人有办法解决吗?

非常感谢.

**更新**

我更新了我的弹性搜索查询并摆脱了该功能评分.我的基本问题仍然存在.



1> Daniel Fackr..:

拼写应该

AND拼写必须

NOR拼写为should_not

例:

您想要查看所有项目(圆形AND(红色或蓝色)):

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

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

感谢Glen Thompson和Sebastialonso找到我的筑巢之前不太合适的地方.

还要感谢Fatmajk指出"术语"在ElasticSearch 6中变得"匹配".


为什么他们不在文档中添加这么简单的例子和​​解释!文档中的示例非常混乱.
当我尝试这个例子时,我回到了`[term]格式错误的查询,预期[END_OBJECT]但找到[FIELD_NAME]`.这是某种版本依赖吗?
6个月后,阅读所有Elastic文档,这是我第一次完全理解如何实现布尔逻辑.我认为官方文件缺乏明确性.
@Amir我可以为您清理哪些错误信息?在上面显示的上下文中,默认的“ minimum_should”为1,如果将至少一项匹配,则将其包装在“ bool”中将导致该组为true,否则为false。创建此答案的动机是,我正在解决此类问题,而在此类站点上可以找到的可用文档甚至答案充其量也无济于事,因此我一直在进行研究,直到我对扎实的扎实了解为止发生了什么。我很高兴欢迎任何关于如何进一步改善答案的建议。
将`should`拉入上层`bool`,包括`minimum_should_match:1`工作?
@DanielFackrell请修复缺少大括号的`should`值
@DanneJ显然,您需要在单个对象中包含"shape":"round"元素,并在兄弟对象中包含内部"bool"部分.这是有效的,但似乎它不是同一个查询.
这是错误的,应该与OR不同!

2> Jesse..:

我终于设法创建了一个完全符合我想要的查询:

过滤的嵌套布尔查询.我不确定为什么没有记录.也许有人可以告诉我?

这是查询:

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语句必须为true.

这个语句意味着只要结果集中有一个包含has_image:1的文档,它就会被因子100提升.这会改变结果排序.

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

有乐趣的人:)


哇靠.有没有人有更好的解决方案?感谢发布这个,但这绝对是在查询中实现逻辑OR的过于复杂.
@EricAlford 2015年的答案基于早期版本的ES.随意提供更好的解决方案.
此查询不仅不必要很长,而且使用不推荐的语法.@ daniel-fackrell答案应该是公认的答案.

3> niranjan har..:

这样,您可以使用Kibana在多个外部布尔查询中嵌套多个布尔查询,

布尔值表示我们正在使用布尔值

必须AND

应该

GET my_inedx/my_type/_search
{
    "query" : {
       "bool": {             //bool indicates we are using boolean operator
            "must" : [       //must is for **AND**
                 {
                   "match" : {
                         "description" : "some text"  
                     }
                 },
                 {
                    "match" :{
                          "type" : "some Type"
                     }
                 },
                 {
                    "bool" : {          //here its a nested boolean query
                          "should" : [  //should is for **OR**
                                 {
                                   "match" : {
                                       //ur query
                                  }
                                 },
                                 { 
                                    "match" : {} 
                                 }     
                               ]
                          }
                 }
             ]
        }
    }
}

这是在ES中嵌套查询的方式

“布尔”中有更多类型,例如-

    过滤

    一定不


推荐阅读
author-avatar
kas8288408
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有