2016-12-31 6 views
0

を動作するようにElasticsearchフィルタを取得できません、elasticsearchモデルの宝石を使用してはRailsの4とElasticsearch 2を使用して

すべてが正常であるとさえ地理ポイントの距離が働いています。しかし、私は単純なブールフィルタの仕事をする方法を私の人生のために解決することはできません。私は単純なブール値 'exclude_from_search_results'を持っています(真の場合)結果からレコードをフィルタリングする必要があります。ここで

は(フィルタなし)レールコントローラの私のクエリです:

@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'}}} 
) 

私はブール値またはクエリセクション内、またはその外側の両方にこれを追加しましたが、私のどちらかがNOの文書、またはすべての文書を取得していません。

例(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

あなたの現在の問い合わせは、あなたのフィルターとマルチマッチクエリ間のORを行っています。そういうわけで、あなたはすべての書類を手に入れます。

フィルタとマルチマッチクエリの間でANDを行いたいとします。 これが当てはまる場合、次のクエリが私のために機能します。

{ 
    "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" 
      } 
     } 
    } 
} 

このヘルプをお寄せいただきありがとうございます。

関連する問題