小编典典

_score,同时在Elasticsearch中进行索引

elasticsearch

{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "filter": {
        "and": [
          {
            "query": {
              "match": {
                "yyyy": {
                  "query": "barfoo"
                }
              }
            }
          }
        ]
      }
    },
    "script": "_score * doc['_score']"
  }
}

这给出了错误

 [custom_score] query does not support [filter]

那么如何评估这样的查询呢?


阅读 260

收藏
2020-06-22

共1个答案

小编典典

我建议您查看有关提升的要求,因为当前的脚本没有太大意义。

另外,请查看elasticsearch
查询DSL的文档。它提供复合查询和简单查询,您可以将它们组合在一起。如错误所示,您不能在自定义分数查询中放入过滤器。您可以在自定义分数查询中使用过滤查询:

{
  "query": {
    "custom_score": {
      "query": {
        "filtered" : {
          "query" : {
            "match": {
              "xxx": {
                "query": "foobar"
              }
            }
          },
          "filter" : {
            "and": [
              {
                "query": {
                  "match": {
                    "yyyy": {
                      "query": "barfoo"
                    }
                  }
                }
              }
            ]
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  }
}

或使用像这样的顶级过滤器

{
  "query": {
    "custom_score": {
      "query": {
        "match": {
          "xxx": {
            "query": "foobar"
          }
        }
      },
      "script": "_score * doc['_score']"
    }
  },
  "filter": {
    "and": [
      {
        "query": {
          "match": {
            "yyyy": {
              "query": "barfoo"
            }
          }
        }
      }
    ]
  }
}

这两个选项的区别在于,如果您在搜索请求中也进行了构面,则不会考虑使用顶级过滤器,而如果将过滤器放入查询中,则会考虑它们。

要看的另一件事:如果只有一个子句,则不需要and过滤器。另外,将全文搜索放在过滤器中通常没有任何意义,因为过滤器是可缓存的,并且鉴于全文搜索是免费的并且几乎是不可预测的,因此将它们缓存是浪费的。

2020-06-22