2017-03-07 92 views
8

Öncelik istisnaları ile ada göre filtrelemeye ve sıralamaya çalışıyorum; bu, sonuçların alfabetik olarak sıralanmasına rağmen, önce belirli bir adın görünmesini istiyorum.Elasticsearch - Öncelik istisnaları ile ada göre filtre ve sıralama

Örneğin

- bu, ben üst vererek sıralanmasını [ "pepsi", "rc-cola", "coca-cola"] Bu dizi istiyorum benim temel sorgu Kısacası

{ 
    "from": 0, 
    "size": 500, 
    "min_score": 0.15, 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "exists": { 
       "field": "brand.id" 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "sort": [ 
    { 
     "brand.names.1.raw": "asc" 
    } 
    ] 
} 

olduğunu Öncelik için "rc-cola" olarak ayarlanacak ve böylece ["rc-cola", "coca-cola", "pepsi"] olarak işaretlenecektir.

Şu anda alfabetik olarak sıralanmıştır.

  1. bir "gereken" "eşleşme" tarafından artırılması ile ekleyin: Ben işe yarayabilir birkaç fikir düşündü. ama sonra "_score" ile sıralama sorunu vardı, ben ilk önce "_score" ve marka adı ile sıralamasına rağmen, alfabetik sıralama ayıklar. Bunu "boole" ye ekleyerek: "should": [{"match": {"brand.id": {"query": 34709, "boost": 20}}}

  2. Denedim "aggregates" yani ilk sorgu (kova) "eşleşir" özel marka adı ve içindeki alfabetik sırayla, ikinci sorgu sadece alfabetik sıralar. ama tamamen mahvoldum.

Filtrelenmiş -> filtreleri kullanmalıyım, komut dosyası sorgularını kullanamıyorum. Teşekkürler.

UPDATE Şu anda belgelerin bir örneği ve nasıl sıralandığı gösterilmiştir. Önce "ccc" markasının önceliklendirilmesini istiyorum, lütfen sorgularımı güncellememe yardımcı olun.

{ 
    "_index": "retailer1", 
    "_type": "product", 
    "_id": "1", 
    "_score": null, 
    "_source": { 
    "id": 1, 
    "brand": { 
     "names": { 
     "1": "aaa" 
     }, 
     "id": 405 
    } 
    }, 
    "sort": [ 
    "aaa" 
    ] 
}, 
{ 
    "_index": "retailer1", 
    "_type": "product", 
    "_id": "2", 
    "_score": null, 
    "_source": { 
    "id": 2, 
    "brand": { 
     "names": { 
     "1": "bbb" 
     }, 
     "id": 406 
    } 
    }, 
    "sort": [ 
    "bbb" 
    ] 
}, 
{ 
    "_index": "retailer1", 
    "_type": "product", 
    "_id": "3", 
    "_score": null, 
    "_source": { 
    "id": 3, 
    "brand": { 
     "names": { 
     "1": "ccc" 
     }, 
     "id": 407 
    } 
    }, 
    "sort": [ 
    "ccc" 
    ] 
}, 
+0

Takip ediyor. Ben de aynısını senaryo yazmadan yapmaya çalıştım. – Yissachar

+0

Bu dizi nedir? Markaların öncelikli olarak sıralanmasını mı istiyorsunuz yoksa ne? –

+0

Belge örneği ve beklenen sonucu gönderirseniz, –

cevap

4

Eğer birincil tür olarak brand.popularity ve brand.names kullanarak sıralayabilir.x, beklenen sonucu sunmak gerekir sorgu aşağıdadır: ile ((gerekirse ham alan kullanmak biraz adapte gerekebilir) Elasticsearch The filtered query is replaced by the bool query, işi yapmalıyım bu sorgu sonraki sürümlerinde

{ 
    "from": 0, 
    "size": 500, 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "term": { 
       "brand.names.1": "ccc", 
       "boost": 10 
       } 
      }, 
      { 
       "exists": { 
       "field": "brand.id" 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "exists": { 
      "field": "brand.id" 
     } 
     } 
    } 
    }, 
    "sort": [ 
    "_score", 
    { 
     "brand.names.1": { 
     "order": "asc" 
     } 
    } 
    ] 
} 

gerekirse ham alanların kullanımı için bir öncekine) Her iki durumda da

{ 
    "from": 0, 
    "size": 500, 
    "query": { 
    "bool": { 
     "filter": { 
     "exists": { 
      "field": "brand.id" 
     } 
     }, 
     "should": [ 
     { 
      "term": { 
      "brand.names.1": "ccc" 
      } 
     } 
     ] 
    } 
    }, 
    "sort": [ 
    "_score", 
    { 
     "brand.names.1": { 
     "order": "asc" 
     } 
    } 
    ] 
} 

, birden fazla tercih edilen maçı ile dolu üst yapmak istiyorsanız belirli bir yer, takviye fonksiyonu yararlanabilirler benzer adaptasyon sipariş

+0

bakın, çalışıyor gibi görünüyor –

3

Burada yerel olarak test ettim. Ayrıca, markayı çok sayıda ada sahip olabileceğinden, sorgulamayı basitleştirmek için isim için değil, marka IDS için sorun. Hala isimler üzerinde sıralama yapmak isterseniz o zaman markanın öncelikli endeksi anda bilindiği Eğer,

POST stack/_search 
{ 
    "query": { 
    "function_score": { 
     "boost_mode": "replace", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "exists": { 
       "field": "brand.id" 
       } 
      } 
      ] 
     } 
     }, 
     "script_score": { 
     "script": { 
      "params": { 
      "ids": [ 
       406, 
       405 
      ] 
      }, 
      "inline": "return params.ids.indexOf(doc['brand.id'].value) > -1 ? 1000 - params.ids.indexOf(doc['brand.id'].value) : _score;" 
     } 
     } 
    } 
    } 
} 
+1

teşekkürler, ama söylediğim gibi: "Filtrelenmiş - filtreleri kullanmalıyım, komut dosyası sorgularını kullanamıyorum." –

3

istedikleri gibi komut dosyasını daha sonra yapabilirsiniz doğrudan endeksi gibi doc:

"brand": { 
     "name": "ccc", 
     "priority":1000, 
     "id": 407 
    } 

Üstte gösterilecek olan markalar yüksek bir popülerliğe sahip olabilirken, diğerlerinin daha düşük bir değere atanmış bir popülerlik değeri olabilir.

bu şekilde endekslemek yoluyla

, doğrudan Elasticsearch sürümü 1 kullanılarak ikincil tür

"sort" : [ 
     { "brand.priority" : {"order" : "desc"}}, 
     { "brand.name" : {"order" : "asc" }} 
    ] 
+1

Teşekkürler, ancak endekslemeye bağlı olmak istemiyorum –

+0

Herhangi bir markanın farklı sorgular için farklı önceliğe sahip olabileceğini mi demek istediniz? – Rahul

+1

Hayır, indekste yapabileceğimi biliyorum, indeksine bağlı kalmak istemiyorum .. Birkaç çalılık sebebim var. Diğer seçenekleri arıyorum. Teşekkürler –