![](/img/trans.png)
[英]How to use a bool Query with function_score in 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
子句接受單個過濾器。 由於需要定義兩個過濾器( term
和range
),因此需要使用復合bool
過濾器將它們組合在一起。 否則,您的語法正確。
另外,您在match
查詢中忘記了“標題”字段
注意:我不確定laravel在ES集成方面如何工作,但是您可能還需要將整個內容放在query
塊中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.