2013-06-28 2 views
0

Я посылаю запрос, как это: (с помощью запроса {все})Elasticsearch: Как получить общий балл как сумму очков повышения?

{ 
    "query": { 
    "custom_filters_score": { 
     "query": { 
     "match_all": {} 
     }, 
     "filters": [ 
     { 
      "filter": { 
      "range": { 
       "last_contact_at": { 
       "gte": "2013-06-21T12:02:25Z" 
       } 
      } 
      }, 
      "boost": 1 
     }, 
     { 
      "filter": { 
      "range": { 
       "available_at": { 
       "gte": "2013-06-28" 
       } 
      } 
      }, 
      "boost": 2 
     }, 
     { 
      "filter": { 
      "term": { 
       "company_type": "intern" 
      } 
      }, 
      "boost": 10 
     }, 
     { 
      "filter": { 
      "range": { 
       "friends_count": { 
       "from": 1 
       } 
      } 
      }, 
      "boost": 3 
     }, 
     { 
      "filter": { 
      "term": { 
       "blacklisted": true 
      } 
      }, 
      "boost": -100 
     }, 
     { 
      "filter": { 
      "term": { 
       "focuses": "ruby php" 
      } 
      }, 
      "boost": 5 
     }, 
     { 
      "filter": { 
      "term": { 
       "tags": "ruby php" 
      } 
      }, 
      "boost": 4 
     } 
     ], 
     "score_mode": "total" 
    } 
    } 
} 

и я получаю следующий ответ с max_score: 16, которая является суммой моих точек наддува.

Response

{ 
    "took": 3, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 10, 
     "max_score": 16, 
... 

И когда я отправляю тот же custom_filters_score, но с запросом {термин строка}

{ 
    "query": { 
    "custom_filters_score": { 
     "query": { 
     "query_string": { 
      "query": "ruby php" 
     } 
     }, 
     "filters": [ 
     { 
      "filter": { 
      "range": { 
       "last_contact_at": { 
       "gte": "2013-06-21T12:03:46Z" 
       } 
      } 
      }, 
      "boost": 1 
     }, 
     { 
      "filter": { 
      "range": { 
       "available_at": { 
       "gte": "2013-06-28" 
       } 
      } 
      }, 
      "boost": 2 
     }, 
     { 
      "filter": { 
      "term": { 
       "company_type": "intern" 
      } 
      }, 
      "boost": 10 
     }, 
     { 
      "filter": { 
      "range": { 
       "friends_count": { 
       "from": 1 
       } 
      } 
      }, 
      "boost": 3 
     }, 
     { 
      "filter": { 
      "term": { 
       "blacklisted": true 
      } 
      }, 
      "boost": -100 
     }, 
     { 
      "filter": { 
      "term": { 
       "focuses": "ruby php" 
      } 
      }, 
      "boost": 5 
     }, 
     { 
      "filter": { 
      "term": { 
       "tags": "ruby php" 
      } 
      }, 
      "boost": 4 
     } 
     ], 
     "score_mode": "total" 
    } 
    } 
} 

и я получаю следующий ответ с max_score: 8,990471

Ответ

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 6, 
     "max_score": 8.990471, 
... 

Как достичь max_score как сумма моих пунктов повышения, а также показать только результаты, содержащие термин?

SearchService: https://gist.github.com/8f13ce2be820d9ef1959

+0

Отдельно от 'max_score' вы получаете ожидаемые результаты? Если нет, можете ли вы привести пример с объяснением? – ramseykhalaf

ответ

0

Из es docs это выглядит как:

  1. Запрос выполняется и множество хитов генерируемой
  2. Фильтры работают на множестве хитов, чтобы дать их оценка.

Похоже, документ со счетом 16 (из match_all запроса) оленья кожа соответствовать "query_string":{"query":"ruby php"} в вашем втором поиске, именно поэтому max_score меньше.

Также вы говорите, что 16, это сумма всех ваших точек наддува, но когда я добавляю партитур образуют фильтры, которые я получаю 25 или -75, если включить черный список ...