2017-03-24 19 views
0

配列内の正確な文字列を検索したい。 ESでの私のデータは以下のようなものです:Elasticsearchの配列内の正確な文字列検索

  { category": [ 
       "abc test" 
      ], 
      "es_flag": false, 
      "bullet_points": [], 
      "content": "", 
      "description": false } 

私はなど、「ABCテスト」、「新しいABCテスト」のように複数のカテゴリを持っている...

私は、クエリの下にしようとしていますが、私は、複数のカテゴリを取得しています結果、私は "abc test"を検索していましたが、 "new abc test"カテゴリも結果に入っています。

{ 
    "from": 0, 
    "size": 30, 
    "query": { 
     "bool" : { 
      "must": [ 
       { "match_phrase": { "category": "abc test" } } 
      ] 
     } 
    }, 
    "sort": [ { "createdAt": { "order": "desc" } } ] 
} 

ご了承ください。

答えて

0

私はあなたがデフォルトのアナライザーを使用していると仮定しています。

  • new abc test
  • abc test new
  • foo abc test bar

そして、それが一致しません。その場合は"field": "abc test"に対するmatch_phraseを含むabc testの隣接トークンのフィールドを持つことになり、すべての文書を、一致します。

  • abc new test - クエリトークンが隣接していない
  • test abc - クエリトークンが隣接しているが、間違った順序で

実際にあなたがあなたのどちらかが新しいインデックスを構築する必要があります(あなたのフィールドにkeywordアナライザを使用している役立つだろう何最初から作成するか、マッピングを更新してください)。あなたはscrachから構築している場合:

curl -XPUT http://localhost:9200/my_index -d ' 
{ 
    "mappings": { 
    "categories": { 
     "properties": { 
     "category": { 
      "type": "text", 
      "analyzer": "keyword" 
     } 
     } 
    } 
    } 
}' 

、その後、あなただけの単純なクエリ、例えばを使用する必要があります(matchまたはtermのいずれかを行います):

curl -XGET http://localhost:9200/my_index/_search -d ' 
{ 
    "query": { 
     "match" : { 
      "message" : "abc test" 
     } 
    } 
}' 
+0

ご返信ありがとうございます。既存のプロパティを更新することができません。 { "エラー":{ "ROOT_CAUSE":[ { "タイプ": "mapper_parsing_exception"、 "理由": "タイプのところハンドラ[テキスト]がフィールド上に宣言されていない[カテゴリ]" } ] 「タイプ」:「mapper_parsing_exception」、 「理由」:400 } 更新中に、私はエラーの上に取得しています: }、 「状態」「タイプ[テキスト]なしハンドラは、フィールド上の[カテゴリ]を宣言しました」インデックス。 –

+0

ESバージョンによっては、「文字列」でもかまいません。どのESバージョンを使用していますか? –

関連する問題