2017-01-15 4 views
0

I/Mのインデックス文書を含むキーワードを使用してドキュメントを見つけることができません。ElasticSearch 5は、次の形式のスペース

{ 
"title": "this is the title", 
"brand": "brand here", 
"filters": ["filter1", "filter2", "Sin filters", "Camera IP"] 
"active": true 
} 

のように続いてクエリが見えます:私はいずれかを返すことができない

'query': { 
      'function_score': { 
       'query': { 
        'bool': { 
         'filter': [ 
          { 
           'term': { 
            'active': True 
           } 
          } 
         ], 
         'must': [ 
{ 
           'terms': { 
            'filters': ['camera ip'] 

           } 
          } 
         ] 
        } 
       } 
      } 
     } 

"Camera IP"フィルタ(またはこの文字列、小文字などのバリエーション)を含むドキュメントがありますが、Esはフィルタを使用したものを返します。 "Sin filters"。

インデックスは次の設定で作成されます。 「フィルタ」フィールドはデフォルトのテンプレートの下にあり、キーワードのタイプです

"settings":{ 
     "index":{ 
      "analysis":{ 
       "analyzer":{ 
        "keylower":{ 
         "tokenizer":"keyword", 
         "filter":"lowercase" 
        } 
       } 
      } 
     } 
    }, 
    "mappings": { 

     "_default_": { 
      "dynamic_templates": [ 
       { 
        "string_as_keywords": { 
         "mapping": { 
          "index": "not_analyzed", 
          "type" : "keyword", 
          **"analyzer": "keylower"** # I also tried with and without changing this analyzer 
          }, 
         "match": "*", 
         "match_mapping_type": "string" 
        } 
       }, 
       { 
        "integers": { 
         "mapping": { 
          "type": "integer" 
         }, 
         "match": "*", 
         "match_mapping_type": "long" 
        } 
       }, 
       { 
        "floats": { 
         "mapping": { 
          "type": "float" 
         }, 
         "match": "*", 
         "match_mapping_type": "double" 
        } 
       } 
      ] 
     } 
} 

私が紛失しているものはありますか? 「Sin filters」フィルタでは「Camera IP」ではないフィルタを返すのは奇妙です。

ありがとうございました。

+0

あなたはどのESのバージョンを使用していますか? –

+0

私は今5.1.1です。 –

答えて

2

フィルタを小文字にしてトークン化しないように思えます。あなたのクエリの問題は、文字列のタイプを「キーワード」に設定し、ESはこれらのフィールドを分析せず、大文字と小文字を変更しないことです。

キーワードフィールドは、正確な値でのみ検索できます。

あなたの設定では、引き続きこのようなクエリを使用してドキュメントを取得できます:{"query": {"term": {"filters": "Camera IP"}}}'

あなたはアナライザは、あなたがこのような何かにあなたのマッピングを変更することにより、textにタイプを設定する必要がありますインデックスを付ける前に、あなたのテキストのケースを変更したいので:

{"settings":{ 
    "index": { 
     "analysis":{ 
      "analyzer":{ 
       "test_analyzer":{ 
        "tokenizer":"keyword", 
        "filter":"lowercase" 
       } 
      } 
     } 
    } 
    }, 
    "mappings": { 
    "_default_": { 
     "dynamic_templates": [ 
      { 
       "string_as_keywords": { 
        "mapping": { 
         "type": "text", 
         "index": "not_analyzed", 
         "analyzer": "test_analyzer" 
         }, 
        "match": "*", 
        "match_mapping_type": "string" 
       } 
      } 
     ] 
    } 
}} 
+0

はい、最終的に使用したのは、キーワードトークナイザです。 –

0

フィルタ'filters': ['camera ip']camera ipを探しますが、マッピングではfiltersというフィールドはkeywordで、elasticsearchは完全一致を探します。したがって、そのフィールドを見つけるためには、一致するインデックスを付ける正確な文字列が必要です。ユースケースで完全一致が必要ない場合は、タイプをtextに変更します。これは、索引付け前にelasticsearchが分析するものです。テキストデータ型の詳細hereとキーワードデータ型here

関連する問題