带有过滤器的Elasticsearch bool查询,

时间:2017-10-06 06:08:50

标签: node.js mongodb elasticsearch mongoosastic

我的主要目的是编写一个必须搜索searchtext的查询,如果应用了加载端口或卸载端口的任何过滤器,那么它必须从搜索文本的结果中过滤掉它。

如果没有应用过滤器,那么它应该继续进行。

例如:我搜索牛仔裤,如果我使用过滤器,那么装货港必须是印度,其卸货港必须是美国。

我试着写这份报告但是没有给出适当的结果。

{
 "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "query_string": {
                  "query": searchText
                }
              }
            ]
          }
        },
        {
          "terms": {
            "loadingPort":loadingPortArray
          }
        },
        {
          "terms": {
            "unloadingPort":unloadingPortArray
          }
        }
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:0)

您的问题是您将所有quires \ filters包装在should中,这意味着所有语句都由OR逻辑组合在一起。如果您需要AND,则需要在must内包装语句。

顺便说一下,您没有使用过滤器,而是使用term查询。在elasticsearch中查询和过滤器之间存在巨大差异。要使用过滤器,您需要使用带有过滤器的bool查询。

{
 "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "must": [
              {
                "query_string": {
                  "query": searchText
                }
              }
            ]
          }
        }        
      ],
      "filter": {
          "bool": {
              "must": [
                  {
                    "terms": {
                        "loadingPort":loadingPortArray
                    }
                  },
                  {
                    "terms": {
                        "unloadingPort":loadingPortArray
                    }
                  }
              ]
          }
      }
    }
  }
}