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

时间:2015-03-11 14:36:23

标签: php mysql laravel elasticsearch

我正在使用ES作为我的Laravel应用程序,我需要进行一个只包含过滤器的搜索查询,而不是"文本搜索"但我不确定如何写它。

我必须使用match_all ,例如:

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

或者像这样:

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

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

2 个答案:

答案 0 :(得分:1)

实际上,如果未在筛选查询中指定query部分,则默认使用match_all查询。引用doc

  

如果未指定查询,则默认为match_all查询。这个   意味着过滤的查询可以用于包装过滤器,所以   它可以在预期的任何地方使用。

您的第二个查询应该完成这项工作:过滤器必须包含在要使用的filtereddoc)或constant_scoredoc)个查询中。

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

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

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

希望这会有所帮助:)

答案 1 :(得分:1)

它实际上完全相同,因为如果未在子句中指定查询,则默认使用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