2016-04-12 10 views
1

私はelasticsearchを用いたトップ検索クエリを作成したいです。elasticsearchにグローバルクエリを書き込む方法は?

elasticsearchテーブルからcategory_namebrand_nametitleと一致させたいと思います。試合はフレーズ、またはまたは条件でなければなりません。

マイクエリ:

$query = [ 
    "bool" => [ 
    "must" => [ 
     ["match" => ["is_published" => 1]], 
     [ 
     "multi_match" => [ 
      "query" => $searchKey, 
      "fields" => ["category_name", "brand_name", "title"] 
     ] 
     ], 
     [ 
     'nested' => [ 
      'path' => 'category_with_in_title.parent_cat', 
      'query' => [ 
      'bool' => [ 
       'must' => [ 

       ['match' => [ 
        'category_with_in_title.parent_cat.status' => 1, 
       ]], 
       ], 
      ], 
      ], 
     ], 
     ], 
     [ 
     'nested' => [ 
      'path' => 'brand', 
      'query' => [ 
      'bool' => [ 
       'must' => [ 
       'match' => [ 
        'brand.approved_status' => 1, 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
     [ 
     'nested' => [ 
      'path' => 'default_product_low_price_with_seller.seller_detail', 
      'query' => [ 
      'bool' => [ 
       'must' => [ 
       'match' => [ 
        'default_product_low_price_with_seller.seller_detail.approve_status' => 1, 
       ], 
       ], 
      ], 
      ], 
     ], 

     ], 
     [ 
     'nested' => [ 
      'path' => 'default_product_low_price_with_seller', 
      'query' => [ 
      'bool' => [ 
       'must' => [ 
       'match' => [ 
        'default_product_low_price_with_seller.status' => 1, 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
    ], 

    ], 
]; 

私はそのためのmulti_matchを使用しますが、どのようにこのクエリでpharseを使用しますか?私は検索するために一言を書かなければならない。例えば

は、私は、そのcategory_name = Tops

私が欲しい私が書く場合に生じる「トップス」または「トップ」または「へ」のレコードを検索したいです。しかし、今私は正確な単語 "トップス"を書く必要があります。

事前のおかげで...

答えて

1

あなたは接頭辞は、テキストの最後の用語に一致することができますことを除いて、match_phraseと同じである、match_phrase_prefixを使用することができます。

"multi_match" => [ 
    "query" => $searchKey, 
    "type": "phrase_prefix", 
    "fields" => ["category_name", "brand_name", "title"] 
] 

が、これはあなたが探しているものであれば、私に教えてください:

あなたがする必要があるすべては、このように、あなたのmulti_matchクエリに"type": "phrase_prefix"を追加することです。

+0

このアプローチは、限界があります。デフォルトのmax_expansionsは50です。クエリの応答時間に影響する可能性があります。参考:https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_time_search_as_you_type.html –

+0

ありがとう先生、これは私はそれが動作するすべてのレコード –

1

multi_matchにはcross_fieldsタイプを使用するのが理想的です。すべてのフィールドを1つの大きなフィールドとして扱い、クエリを実行します。しかし、これらの上で曖昧さが無効になっているため、完全一致のみが表示されます。

を参照してくださいRevelant Githubの問題はhttps://github.com/elastic/elasticsearch/issues/6866

そこで、私の推薦はfuzzy_like_thiselasticsearch version 1.x)またはmore_like_thiselasticsearch version 2.x)とmulti_matchを交換することです。

$query = [ 
    "bool" => [ 
    "must" => [ 
     ["match" => ["is_published" => 1]], 
     [ 
     "fuzzy_like_this" => [ 
      "fields" => ["category_name", "brand_name", "title"], 
      "like_text" => $searchKey 
     ] 
     ], 
     .... 
+0

感謝の先生が届かないのですが、私は書く必要が動作していません検索する完全な単語。たとえば、category_name = Topsのレコードを取得したい場合は、レコードを取得するために 'tops'または 'top'と書く必要があります。私は(トップを検索するために)「to」と書くと、私はレコードを取得しません。 –

+0

'fuzzy_like_this'配列に、' 'fuzziness" => 3'を追加します。これはマッチの可能性を高めます。また、あなたのインデックスが分析されないかもしれないという事実を指摘するかもしれません。参照:https://www.elastic.co/guide/en/elasticsearch/guide/current/analysis-intro.html – Mysteryos

+0

卿は、私が分析に構造を変更せずにクエリを使用できますか? –

関連する問題