2015-08-27 75 views
0

我是Elastic Search的新手。我有一個複雜的場景,我無法爲此獲得正確的解決方案(彈性查詢/參數)。任何幫助將不勝感激。彈性搜索複雜場景

我的田地

  • 產品名稱(字符串)
  • 價格最小
  • 價格最高
  • 房態狀態(可用的編緝/不可用)

的除了這些搜索將始終對唯一用戶進行過濾。因此MySQL查詢看起來像:

Select * from product where product_name like %xxx% AND price >= price_min AND price <= price_max AND availability = availability_ status AND user = 1; 

我想確切的彈性搜索PARAMS解決這種情況下或附近約的解決方案也可以理解。

回答

0

您需要在此處使用過濾器,因爲您需要完全匹配而不是全文匹配。這種方式更快。

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { "name": "YourName" } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { "range": { "price_min": { "gte": 20 }}}, 
      { "range": { "price_max": { "lte": 170 }}}, 
      { "term" : { "availability" : "false" }} ] 
     } 
     } 
    } 
    } 
} 

您在「yourName」中提供的是全文匹配(如果分析了名稱字段,將返回類似名稱)。我假設你已經保持不變,所以這個字段被默認分析(Stemmed +停用詞的刪除)。 既然你需要結果來匹配所有的標準它的一個AND組合。因此,使用

布爾過濾器以AND的所有條款。

0

所以給你的SQL查詢

SELECT * 
    FROM product 
WHERE product_name LIKE '%xxx%' 
    AND price >= price_min 
    AND price <= price_max 
    AND availability = availability_status 
    AND user = 1; 

我們需要:

所有這些都包裹filtered query,其過濾器將過濾掉所有不匹配的文件裏面,最後match查詢將在剩餘的文件運行相匹配的product_name

正確的查詢會看起來像這樣:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match": { 
      "product_name": "xxx" 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "price": { 
        "gte": 20, 
        "lte": 170 
       } 
       } 
      }, 
      { 
       "term": { 
       "availability": "availability_status" 
       } 
      }, 
      { 
       "term": { 
       "user": 1 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
}