2016-12-31 58 views
0

使用Elasticsearch 2與Rails 4,使用elasticsearch模型寶石無法使Elasticsearch過濾器工作

一切都很好,甚至地理距離的工作。但是,我無法爲我的生活制定一個簡單的布爾過濾器工作方式。我有一個簡單的布爾'exclude_from_search_results'(當爲true時)應該導致記錄從結果中過濾掉。

這是我在軌控制器查詢(沒有過濾器):

@response = Firm.search(
    query: { 
     bool: { 
     should: [ 
      { multi_match: { 
       query: params[:search], 
       fields: ['name^10', 'address_1', 'address_2', 'address_3', 'address_4', 'address_5', 'address_6'], 
       operator: 'or' 
      } 
      } 
     ] 
     } 
    }, 
    aggs: {types: {terms: {field: 'firm_type'}}} 
) 

我無論是BOOL或查詢部分中添加了這個,還是境外,但我要麼拿不出文件,或所有文件。 (9000應該匹配)

例子:

@response = Firm.search(
    query: { 
     bool: { 
     should: [ 
      { multi_match: { 
       query: params[:search], 
       fields: ['name^10', 'address_1', 'address_2', 'address_3', 'address_4', 'address_5', 'address_6'], 
       operator: 'or' 
      } 
      } 
     ], 
      filter: { 
      term: {"exclude_from_search_results": "false"} 
     } 
     } 
    }, 
    aggs: {types: {terms: {field: 'firm_type'}}} 
) 

我也試着將過濾器子句中不同的地方,但要麼得到錯誤或沒有結果。我究竟做錯了什麼??也許簡單的東西...

這裏是我的映射:

"mappings" : { 
    "firm" : { 
    "dynamic" : "false", 
    "properties" : { 
     "address_1" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "address_2" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "address_3" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "address_4" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "address_5" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "address_6" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     }, 
     "exlude_from_search_results" : { 
     "type" : "boolean" 
     }, 
     "firm_type" : { 
     "type" : "string", 
     "index" : "not_analyzed" 
     }, 
     "location" : { 
     "type" : "geo_point" 
     }, 
     "name" : { 
     "type" : "string", 
     "index_options" : "offsets", 
     "analyzer" : "english" 
     } 

不勝感激任何指針...

回答

1

您當前的查詢做或過濾器和多比對查詢之間。這是你獲取所有文檔的原因。

我想你想做的事情和過濾器和多重匹配查詢之間。 如果是這種情況,那麼以下查詢適用於我。

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "multi_match": { 
         "query": "address1", 
         "fields": [ 
          "name^10", 
          "address1", 
          "address2", 
          "address3", 
          "address4", 
          "address5", 
          "address6" 
         ], 
         "operator": "or" 
        } 
       }, 
       { 
        "term": { 
        "exclude_from_search_results": { 
         "value": "false" 
        } 
        } 
       } 
      ] 
     } 
    }, 
    "aggs": { 
     "types": { 
      "terms": { 
       "field": "name" 
      } 
     } 
    } 
} 

希望這幫助,謝謝。