2016-08-11 210 views
1

我有一個類型的彈性與文檔這種結構排序嵌套場

{ 
    "name": "Foo Bar", 
    "myTags": [ 
    { 
     "id": 3, 
     "name": "My tag 1" 
    }, 
    { 
     "id": 5, 
     "name": "My Tag 5" 
    }, 
    { 
     "id": 7, 
     "name": "My Tag 7" 
    } 
    ] 
} 

現在,給3個標籤,我想獲得通過匹配標籤的數量排序的所有文件。所以首先匹配所有3個標籤的文檔比那些匹配2個然後1個最終沒有匹配的文檔。

我該怎麼做?

+0

您使用得分,這和使用'bool'三(3標籤)'should'語句會加重計分,如果一個標籤「匹配」(無論你的用例如何)。這個想法是,如果一個標籤匹配,它會增加分數。 –

回答

0

你可以用function_score做到這一點:

{ 
    "query": { 
    "function_score": { 
     "query": { 
     "match_all": {} 
     }, 
     "functions": [ 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 1" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 5" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     }, 
     { 
      "filter": { 
      "nested": { 
       "path": "myTags", 
       "query": { 
       "term": { 
        "myTags.name": "My Tag 7" 
       } 
       } 
      } 
      }, 
      "weight": 1 
     } 
     ], 
     "boost_mode": "sum", 
     "score_mode": "sum" 
    } 
    } 
} 
+0

我忘了提及我在Elastic 1.7.5上。這個查詢是否正常? – Hpatoio

+0

它應該與1.7一起工作。這個想法是,如果一個文檔匹配其中一個標籤,分數就會得到+1。如果它與另一個標籤匹配,那麼另一個+1等等。基本上,最終得分將是匹配標籤+1的數量(來自默認'match_all'默認查詢)。 –

+0

我不得不將'weight:1'更改爲'weight:2',否則當使用一個標籤進行過濾時,我得到了奇怪/錯誤的結果。 – Hpatoio