带过滤器的 Elasticsearch bool 查询应该
Elasticsearch bool query with filter and should
我的主要目标是编写一个必须搜索搜索文本的查询,如果应用了装货港或卸货港的任何过滤器,那么它必须从搜索文本的结果中过滤掉它。
如果没有应用过滤器,则应该继续进行。
例如:我搜索牛仔裤,如果我应用过滤器,则装货港必须是印度,其卸货港必须是美国。
我试着写了这份报告,但没有给出合适的结果。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"query_string": {
"query": searchText
}
}
]
}
},
{
"terms": {
"loadingPort":loadingPortArray
}
},
{
"terms": {
"unloadingPort":unloadingPortArray
}
}
]
}
}
}
您的问题是您将所有 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
}
}
]
}
}
}
}
}
我的主要目标是编写一个必须搜索搜索文本的查询,如果应用了装货港或卸货港的任何过滤器,那么它必须从搜索文本的结果中过滤掉它。
如果没有应用过滤器,则应该继续进行。
例如:我搜索牛仔裤,如果我应用过滤器,则装货港必须是印度,其卸货港必须是美国。
我试着写了这份报告,但没有给出合适的结果。
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"query_string": {
"query": searchText
}
}
]
}
},
{
"terms": {
"loadingPort":loadingPortArray
}
},
{
"terms": {
"unloadingPort":unloadingPortArray
}
}
]
}
}
}
您的问题是您将所有 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
}
}
]
}
}
}
}
}