2016-04-12 24 views
1

elasticsearch kullanarak en çok arama sorgusu oluşturmak istiyorum.Elasticsearch'te global sorgu nasıl yazılır?

elasticsearch tablosundan category_name, brand_name ve title eşleştirmelerini istiyorum. Maç, ifade veya koşul veya koşul ile olmalıdır.

Benim sorgusu:

$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, 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
    ], 

    ], 
]; 

Bunun için multi_match kullanmak ama nasıl bu sorguda pharse kullanılır? Arama yapmak için bütün kelimeyi yazmalıyım. Örneğin

:

Kimin category_name = Tops

istediğim i yazarsanız neden "başında" ya da "top" ya da "hiç" kaydını aramak istiyorsunuz. Ama şimdi tam kelimeyi "Tops" yazmalıyım. o öneki sağlayan önceden

Teşekkür ...

cevap

1

Bunu haricinde match_phrase aynıdır match_phrase_prefix, kullanabilirsiniz metinde son terim eşleşir.

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

bu aradığınız ne varsa söyleyin:

yapmanız gereken tek şey, bu gibi, multi_match sorguya "type": "phrase_prefix" eklemektir.

+0

Bu yaklaşımın bir sınırlaması vardır. Varsayılan max_expansions değeri 50'dir ve bu, sorgu yanıt sürenizi etkileyebilir. Referans: https://www.elastic.co/guide/en/elasticsearch/guide/current/_query_time_search_as_you_type.html –

+0

Teşekkürler efendim, ama bu işe yaramıyor hiçbir kayıt almıyorum –

1

multi_match'u cross_fields türüyle birlikte kullanmanız gerekir; bu, tüm alanları BIR büyük alan olarak ele alır ve sorgunuzu üzerinde çalıştırır. Ancak, bunlarda şaşkınlık nedeniyle, sadece tam eşleşme gösterilecektir.

Bkz Revelant Github Sayıhttps://github.com/elastic/elasticsearch/issues/6866

Dolayısıyla, benim önerim fuzzy_like_this (elasticsearch version 1.x) ya da more_like_this (elasticsearch version 2.x) ile multi_match değiştirmektir.

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

Teşekkürler efendim işe yarıyor ama yazmak zorundayım aramak için tam kelime. Örneğin hangi category_name = Tops hangi kayıtları almak istiyorum, o kayıtları almak için 'tops' veya 'top' yazmak zorundayım. Eğer 'to' yazıyorsam (herhangi bir kayıt var) kayıt alamıyorum. –

+0

'fuzzy_like_this' dizisinde' fuzziness '=> 3' ekleyin. Bu eşleşme olasılığını artıracaktır. Ayrıca, endekslerinizin analiz edilemeyebileceğine de işaret edebilir. bakınız: https://www.elastic.co/guide/en/elasticsearch/guide/current/analysis-intro.html – Mysteryos

+0

Sorguyu analiz edilmeksizin değiştirmeden kullanabilir miyim? –

İlgili konular