0

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

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

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

我试图写这份报告,但它没有给出适当的结果。

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

1 回答 1

1

您的问题是您将所有 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
                    }
                  }
              ]
          }
      }
    }
  }
}
于 2017-10-06T13:49:38.263 回答