2016-05-19 10 views
0

私はelasticsearch(質問にelasticsearch-phpを使用)を使用する方法を学ぼうとしています。 $ valが検索語であるelasticsearch:単語の一部を検索する

$query = [ 
    'filtered' => [ 
     'query' => [ 
      'bool' => [ 
       'should' => [ 
        ['match' => [ 
         'name' => [ 
          'query' => $val, 
          'boost' => 7 
         ] 
        ]], 
        ['match' => [ 
         'category' => [ 
          'query' => $val, 
          'boost' => 5 
         ] 
        ]], 
       ], 
      ] 
     ] 
    ] 
]; 

['id' => 1, 'name' => 'butter', 'category' => 'food'], 
['id' => 2,'name' => 'buttercup', 'category' => 'food'], 
['id' => 3,'name' => 'something else', 'category' => 'butter'] 

は今、私はこのようになり、検索クエリを作成しました:私はこのような何かを見て、いくつかのデータを、挿入しました。これはうまく動作します。唯一の問題です:「バター」を検索すると、検索エンジンが正確な単語と一致するように見えるため、1と3のIDは見つかりましたが、2は見つかりませんでした。 "単語の中で"検索する方法はありますか、またはmysqlの用語でWHERE name LIKE '%val%'のようなことをする方法はありますか?

答えて

1

あなたはwildcardクエリ

$query = [ 
    'filtered' => [ 
     'query' => [ 
      'bool' => [ 
       'should' => [ 
        ['wildcard' => [ 
         'name' => [ 
          'query' => '*'.$val.'*', 
          'boost' => 7 
         ] 
        ]], 
        ['wildcard' => [ 
         'category' => [ 
          'query' => '*'.$val.'*', 
          'boost' => 5 
         ] 
        ]], 
       ], 
      ] 
     ] 
    ] 
]; 

またはquery_stringクエリを試すことができます。

$query = [ 
    'filtered' => [ 
     'query' => [ 
      'bool' => [ 
       'should' => [ 
        ['query_string' => [ 
         'default_field' => 'name', 
         'query' => '*'.$val.'*', 
         'boost' => 7 
        ]], 
        ['query_string' => [ 
         'default_field' => 'category', 
         'query' => '*'.$val.'*', 
         'boost' => 7 
        ]], 
       ], 
      ] 
     ] 
    ] 
]; 

多くのデータがある場合はどちらも機能しますが、実際には機能しません。

これを行う正しい方法は、custom analyzerに標準のトークナイザとngram token filterを使用して、各トークンを小さなものにスライスして切り抜くことです。

+0

ありがとうございます!特にこれを行う正しい方法を教えてください。 – Chi

+0

@Chiこれ以上の情報は必要ですか? – Val

関連する問題