2013-06-05 16 views
30

プロパティの名前と姓を持つオブジェクトUserがあります。私はこれらのフィールドで1つのクエリを使って検索したいのですが、ドキュメントではmulti_matchが見つかりましたが、ワイルドカードで正しく使用する方法はわかりません。出来ますか?ElasticSearchワイルドカードでmulti_matchを使用する方法

私はmulti_matchクエリをしようとしたが、それは動作しませんでした:私は、ワイルドカードを使用していないだろう

{ 
    "query": { 
     "multi_match": { 
      "query": "*mar*", 
      "fields": [ 
       "user.name", 
       "user.surname" 
      ] 
     } 
    } 
} 

答えて

47

また、ワイルドカードを使用してquery_stringクエリを使用することもできます。

"query": { 
    "query_string": { 
     "query": "*mar*", 
     "fields": ["user.name", "user.surname"] 
    } 
} 

これは、(私の他の回答を参照してください)インデックス時にNGRAMフィルタを使用するよりも遅くなりますが、あなたが迅速かつ汚いソリューションを探しているなら...

また、私はわかりませんあなたがuser.name代わりのnameを使用している場合は、あなたのマッピングについては、しかし、あなたのマッピングは次のように見ている必要があります

"your_type_name_here": { 
    "properties": { 
     "user": { 
      "type": "object", 
      "properties": { 
       "name": { 
        "type": "string" 
       }, 
       "surname": { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 
+1

query_stringはこれ以上の機能を果たし、luceneクエリ構文を公開します。むしろワイルドカードクエリを調べたいと思います。 – javanna

+0

'query_string'は何の詳細へのリンクを貼り付けることができますか?私はその行動についてちょっと混乱しています... – ramseykhalaf

+1

このページの一番下を見ると、query_stringとmatchクエリの比較ができます。http://www.elasticsearch.org/guide/reference/query-dsl/match-query/ – javanna

3

、それがうまくスケールしません。クエリ時に多くの検索エンジンを要求しています。 nGramフィルタを使用すると、検索時ではなくインデックス時に処理を実行できます。あなたはしかし、ワイルドカードなしでマルチマッチングを使用して、期待どおりの結果を得ることができます(上記のリンクの例があり、あなたのマッピングを変更)を正しくnamesurnameのインデックスを作成した後

See this discussion on the nGram filter.

+3

欠点:インデックスのサイズが大きくなりそうです。 – javanna

4

私はちょうど今、これをしなかった:

GET _search { 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "range": { 
         "theDate": { 
          "gte": "2014-01-01", 
          "lte": "2014-12-31" 
         } 
        } 
       }, 
       { 
        "match" : { 
         "Country": "USA" 
        } 
       } 
      ], 
      "should": [ 
       { 
        "wildcard" : { "Id_A" : "0*" } 
       }, 
       { 
        "wildcard" : { "Id_B" : "0*" } 
       } 
      ],"minimum_number_should_match": 1 
     } 
    } 
} 
11

このようなクエリは、私の仕事:

あなたは私の場合には異なるフィールドのための異なるマスクがあるかもしれないことを除いて、何をしているかと同様に
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "should": [ 
      {"query": {"wildcard": {"user.name": {"value": "*mar*"}}}}, 
      {"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}} 
      ] 
     } 
     } 
    } 
    } 
} 

関連する問題