2015-06-07 56 views
3

我想編寫一個查詢搜索上兩列的產品稱爲category1category2。我正在使用彈性搜索PHP客戶端,並嘗試與匹配應查詢,但這給了我錯誤的結果,因爲子串的匹配。Elasticsearch一方或匹配查詢

但我在尋找與操作精確匹配或兩列。我對此很陌生,請引導我。

$params['index'] = 'furnit'; 
    $params['type'] = 'products'; 
    $params['body']['query']['bool']['should'] = array(
     array('match' => array('category1' => $category->name)), 
     array('match' => array('category2' => $category->name)), 
    ); 

    $results = $this->elasticsearch->search($params); 
+0

如果你有類ID(S )這些類別,你應該使用,如果你是不是在找得分和相關性,我認爲用在類ID(S)一個布爾值過濾器可能會做正確的方式。 還要考慮 - 爲布爾查詢minimum_number_should_match參數。 –

回答

0

如果您沒有在這種情況下使用布爾查詢搜索那麼是不是要做到這一點在elasticsearch正確的方式。查詢用於搜索關鍵字和搜索關鍵詞的相關性以及匹配文檔的分數。

在這裏,您可以申請elasticsearch的布爾過濾器來過濾掉了預期的效果。對查詢使用過濾器(過濾查詢)是正確的方法,因爲它排除了所有不匹配的文檔,然後您可以使用匹配查詢來搜索所需的文檔。

這裏是一個布爾過濾

{ 
    "from": 0, 
    "size": 50, 
    "sort": [ 
     { 
      "name" : { 
       "order": "asc" 
      } 
     } 
    ], 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all" : {} 
      }, 
      "filter": { 
       "bool": { 
        "should": [ 
         { 
          "term": { 
           "category1" : "category1" 
          } 
         }, 
         { 
          "term": { 
           "category2" : "category2" 
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

你可以參考文檔,以及(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html

0

也許你的問題是你有使用默認的分析(這是標準的分析儀)的例子。 你可以給我你的映射嗎? 我建議您更改索引時使用not_analyzer和長期使用過濾器/查詢。

你可以使用這裏把映射設置您的分析儀:Put Mapping

編輯:我已經爲您創建一個要點,點擊此處查看:

Mappings & Terms Filter