是否可以在elasticsearch中只使用没有文本搜索的过滤器

Is it possible to only use filters without text search in elasticsearch

我正在为我的 Laravel 应用程序使用 ES,我需要做一个只包含过滤器而不包含 "text search" 的搜索查询,但我不确定如何编写它。

我必须使用 match_all 例如:

$query = [
   'filtered' => [
   'query' => [
       'match_all' => []
    ],
      'filter'=> [
         'bool' => [
            'must' => [
               [ 'range' => [
                  'price' => [
                     'lte' => 9000
                  ]
               ]
               ],
            ],
         ]
      ],
   ],
];

或者像这样:

$query = [
   'filtered' => [
      'filter'=> [
         'bool' => [
            'must' => [
               [ 'range' => [
                  'price' => [
                     'lte' => 9000
                  ]
               ]
               ],
            ],
         ]
      ],
   ],
];

我想要的是只使用过滤的布尔查询而不进行文本搜索。

事实上,如果您没有在过滤查询中指定 query 部分,默认情况下会使用 match_all 查询。引用 doc :

If a query is not specified, it defaults to the match_all query. This means that the filtered query can be used to wrap just a filter, so that it can be used wherever a query is expected.

您的第二个查询应该可以完成这项工作:过滤器必须包含在 filtered (doc) 或 constant_score (doc) 中要使用的查询。

如果评分部分对您没有用,您可以坚持filtered查询。

最后一件事:您不必将过滤器嵌套在 bool 过滤器中,除非您想将它与其他过滤器结合使用。在你的演示案例中,你可以直接写:

$query = [
   'filtered' => [
      'filter'=> [
         'range' => [
             'price' => [
                'lte' => 9000
             ]
          ]
      ]
   ]
];

希望这会有所帮助:)

实际上完全一样,因为如果在子句中未指定查询,则默认使用 match_all 查询。

在查询上下文中,如果您需要在没有查询的情况下使用过滤器(例如,匹配收件箱中的所有电子邮件),您可以省略查询:

GET /_search
{
    "query": {
        "filtered": {
            "filter":   { "term": { "folder": "inbox" }}
        }
    }
}

如果未指定查询,则默认使用 match_all 查询,因此前面的查询等同于以下内容:

GET /_search
{
    "query": {
        "filtered": {
            "query":    { "match_all": {}},
            "filter":   { "term": { "folder": "inbox" }}
        }
    }
}

在这里查看官方文档:http://www.elastic.co/guide/en/elasticsearch/guide/current/_combining_queries_with_filters.html