【问题标题】:Is it possible to only use filters without text search in elasticsearch是否可以在elasticsearch中只使用没有文本搜索的过滤器
【发布时间】:2023-03-28 03:48:01
【问题描述】:

我在我的 Laravel 应用程序中使用 ES,我需要做一个只包含过滤器且没有“文本搜索”的搜索查询,但我不确定如何编写它。

我必须使用 match_all 例如:

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

或者像这样:

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

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

【问题讨论】:

    标签: php mysql laravel elasticsearch


    【解决方案1】:

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

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

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

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

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

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

    希望这会有所帮助:)

    【讨论】:

    • 谢谢!然后我将继续我的第二个查询。我在 bool 中有多个过滤器。我只是去掉了一些,忘记在这个例子中删除 bool :)
    【解决方案2】:

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

    【讨论】:

    • 为你的解释干杯
    猜你喜欢
    • 2016-05-27
    • 2019-06-11
    • 2019-04-25
    • 1970-01-01
    • 2014-09-08
    • 2012-08-30
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多