簡體   English   中英

Elasticsearch不確定我是否需要使用布爾查詢

[英]Elasticsearch not sure if i need to use a bool query

我正在為Laravel應用程序使用ES,並且不確定是否需要使用布爾查詢。

在我的查詢中,我需要這樣做:

全文搜索“標題”字段

一個檢查“價格”字段在1-9999之間的過濾器

一個檢查“狀態”字段等於1的過濾器。

那我需要對上面的內容進行布爾查詢嗎? 將標題和狀態設置為(必須),價格設置為(應)

或者我可以簡單地執行以下操作:

 'filtered' => [
    'filter' => [
      ['term' => [ 'status' =>  1] ],
                            [ 'range' => [
                                    'price' => [
                                        'gte' => 1,
                                        'lte' => 99999,
                                    ]
                                ]
    ],
    'query' => [
      'match' => Input::get('query', ''),
      ],
    ],
  ],

或更新:

'filtered' => [
                'query' => [
                    'match' => ['title' => Input::get('query')]
                ],
                'filter'=> [
                    'bool' => [
                        'must' => [
                            ['term' => [ 'active' =>  1] ],
                            [ 'range' => [
                                    'price' => [
                                        'gte' => 1,
                                        'lte' => 99999,
                                    ]
                                ]
                            ]
                        ]
                    ]
                ],
            ],

您的設置(理論上)是正確的,但是語法有些偏離。 首先是理論:

查詢用於確定評分和相關性。 查詢基本上確定了文檔的等級以及它們返回的順序。

過濾器是簡單的包含/排除條件。 如果文檔與過濾器匹配,則將包含在結果中。 如果不匹配...不包括在內。 由於過濾器不執行任何評分,因此它們的速度要快得多(並且可以輕松緩存)。

因此,將過濾器用於簡單的包含/排除條件。 並使用查詢來查詢需要影響得分的所有內容(例如全文搜索)。

這意味着您的查詢是完全正確的。 但是語法需要一些調整:

'filtered' => [
    'filter' => [
      'bool' => [
         'must' => [
            ['term' => [ 'status' =>  1] ], 
            [ 
               'range' => [
                  'price' => [
                      'gte' => 1,
                      'lte' => 99999,
                  ]
               ] 
            ]
         ]               
      ]
  ],
  'query' => [
      'match' => [
        'title' => Input::get('query', '')
      ]
   ]
]

基本上,已filtered查詢的filter子句接受單個過濾器。 由於需要定義兩個過濾器( termrange ),因此需要使用復合bool過濾器將它們組合在一起。 否則,您的語法正確。

另外,您在match查詢中忘記了“標題”字段

注意:我不確定laravel在ES集成方面如何工作,但是您可能還需要將整個內容放在query塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM