2016-10-07 3 views
0

私はelasticsearch-model gemを使用してRailsウェブアプリケーションを構築しています。私は、私のPlaceモデルのフィルタリングを使って検索クエリを作成したいと思います。私は名前で検索することに成功しましたが、私は都市(この例ではロンドン)で検索を絞りたいと思っています。弾性シートレールフィルター

今私のクエリは次のようになりますのために:フィルター部なし

"query": { 
    "bool": { 
     "must": { 
     "match": { 
      "name": { 
      "query": term, 
      "operator": "and", 
      "fuzziness": 1 
      } 
     } 
     }, 
     "filter": { 
      "term": { 
       "city": "London" 
      } 
     } 
    } 
    } 

と私の単純な呼び出しPlace.search("here goes query").records.to_a

よりも検索が正常に動作しますが、私は、フィルタを追加するとき、私はどんな結果を得ることはありません。

これはプレイス検索のマッピングである:ここで

settings analysis: { 
    filter: { 
     ngram_filter: { 
      type: "nGram", 
      min_gram: 2, 
      max_gram: 20 
     } 
    }, 
    analyzer: { 
     ngram_analyzer: { 
      type: "custom", 
      tokenizer: "standard", 
      filter: [ 
       "lowercase", 
       "asciifolding", 
       "ngram_filter" 
      ] 
     }, 
     whitespace_analyzer: { 
      type: "custom", 
      tokenizer: "whitespace", 
      filter: [ 
       "lowercase", 
       "asciifolding" 
      ] 
     } 
    } 
} do 
    mappings dynamic: 'false' do 
    indexes :name, 
      type: "string", 
      analyzer: "ngram_analyzer", 
      search_analyzer: "whitespace_analyzer" 

は、私はフィルタリングする方法を確認するために使用したリンクです:Elasticsearch doc

+0

一つcommongの落とし穴は、データが弾性検索が代わりにトークナイザをもとに、「トークン」を呼び出し、フィルタは、彼らが作成したトークンと一致しているかに分けてしまうことですもともとインデックスに登録されていたデータではありません。例えば、 "AD-13"の値を持つフィールドを索引付けした後、私は "ad"と "13"のトークンを持っていたので、 "AD-13"は結果を返しませんでした。 – bkunzi01

+0

私は少し修正したと思います。 'indexes:city、type:" string "'を追加しました。しかし、それは単一の単語で構成され、小文字の都市とだけ動作します。私はそれを修正するためにアナライザを使わなければならないと思います。 –

+0

アナライザーは間違いなく問題です。スペースを使って値を分割して別々のトークンにするのを避けるために行ったことであるフィールドを分析しないように指定することができます。 – bkunzi01

答えて

0

私は文字列に都市のマッピングタイプに定義し、実行しないしなければなりませんでした私がトークンを構築していたときに、その分野に関するあらゆる種類の分析。

だからマッピングで私がコメントを追加しました:

indexes :city, 
     type: "string", 
     index: "not_analyzed"