2015-07-03 2 views
1

Как вы включаете непревзойденные элементы в результатах поиска elasticsearch?Показать непревзойденные документы в elasticsearch

Например,

У меня есть список, который несколько выглядит следующим образом:

[ 
    { 
     "_index": "products", 
     "_type": "71", 
     "_id": "556637aed75a1334f69db5d7", 
     "_score": 1, 
     "_source": { 
      "product_id": "556637aed75a1334f69db5d7", 
      "categories": [ 
       28 
      ], 
      "tags": ["shirts"] 
     } 
    }, 
    { 
     "_index": "products", 
     "_type": "71", 
     "_id": "556637aed75a1334f69db5d2", 
     "_score": 1, 
     "_source": { 
      "product_id": "556637aed75a1334f69db5d2", 
      "categories": [ 
       27 
      ], 
      "tags": [] 
     } 
    }, 
    { 
     "_index": "products", 
     "_type": "71", 
     "_id": "556637aed75a1334f69db5e4", 
     "_score": 1, 
     "_source": { 
      "product_id": "556637aed75a1334f69db5e4", 
      "categories": [ 
       26 
      ], 
      "tags": [ 
       "shoes" 
      ] 
     } 
    }, 
    { 
     "_index": "products", 
     "_type": "71", 
     "_id": "556637aed75a1334f69db5dd", 
     "_score": 1, 
     "_source": { 
      "product_id": "556637aed75a1334f69db5dd", 
      "categories": [ 
       23 
      ], 
      "tags": [] 
     } 
    } 
] 

Я хотел бы получить результат, который показывает, согласованные документы первым и непарные документов рядом.

Если мой запрос выглядел примерно так:

{ 
    "query": { 
     "terms": { 
      "tags": [ 
       "shorts", 
       "shoes" 
      ] 
     } 
    }, 
    "sort": [ "_score" ] 
} 

я хотел бы получить список только те элементы, которые имеют либо shoes или shorts тегов.

Я хотел бы также показать непревзойденные элементы после согласованных.

Кроме того, я хотел бы добавить categories в мой поисковый запрос. Может кто-то помочь мне с этим?

ответ

1

Прежде всего, вам не нужно sort на _score. По умолчанию сортировка результатов производится по зачету.

Во-вторых, нет такой вещи, как отображение «непревзойденных» документов. Вам нужно определить собственное правило соответствия «непревзойденный». На мой взгляд, вам нужен match_all.

В-третьих, я предлагаю использовать bool, где каждое условие у вас есть (совпадение по тегам, матч по категориям, match_all - в соответствии с «несоответствующие» Документах) должен быть помещен в should. Каждое условие добавит что-то к оценке. Это означает, что чем больше условий соответствует, тем больше очков. Если tags и categories не совпадают, оценка для остальных документов (те, которые соответствуют match_all) будет низкой, поэтому они будут в конце списка.

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "terms": { 
      "tags": [ 
       "shorts", 
       "shoes" 
      ] 
      } 
     }, 
     { 
      "match_all": {} 
     }, 
     { 
      "terms": { 
      "categories": [26,23] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Вау, не могу поверить, что все было так просто. Спасибо, Андрей, я пытался понять это в течение последних двух дней. – clueless

+0

:-) Не беспокойся, я рад, что смог помочь вам. –

+0

Btw, можно ли повысить релевантность для 'категорий'? Я попытался добавить '{boost: 2}' после 'terms', но это дало мне ошибку. EDIT: жаль, не ошибка, но, скорее, не дал мне разные результаты. – clueless

Смежные вопросы