2013-10-02 1 views
1

Как я могу использовать поиск elastics для поиска людей, относящихся к определенному возрасту? Итак, если я вхожу в возраст 28 лет, я хочу, чтобы люди, которым было 28, имели самый высокий балл, но также хотят, чтобы люди, которым показано 27, были показаны, но с более низким счетом. Дата рождения хранится в следующем формате yyyy-mm-dd, поэтому мне придется преобразовать возраст на сегодняшний день, но это не проблема.Используйте Elasticsearch, чтобы найти записи с датой около определенной даты.

У меня есть следующие до сих пор:

{ 
    "query": { 
     "fuzzy": { 
      "birthdate": { 
       "value": "1985-10-01", 
       "min_similarity": "1096d" 
      } 
     } 
    } 
} 

min_similarity из 1096d означает, что люди, которые родились с 1 октября 1985 года +/- 3-х лет.

Таким образом, все люди, родившиеся между 1982 и 1988 годами, показаны - это отлично работает, но все они имеют одинаковый балл 1,0. Как я могу получить самый высокий балл для записи с датой рождения, ближайшей к 1985-10-01?

ответ

3

Вы можете рассчитывать собственные баллы, используя скрипт. Этот скрипт использует SimpleDateFormat для анализа вашей даты (1985-10-01), затем вычисляет абсолютное значение этой даты (в мс) минус дата документа (в мс). Сначала вы хотите получить самое низкое значение (ближе всего к целевой дате), поэтому сортируйте по счету по возрастанию, а не по умолчанию.

{ 
    "query": { 
    "custom_score": { 
     "query": { 
     "fuzzy": { 
      "birthdate": { 
      "value": "1985-10-01", 
      "min_similarity": "1096d" 
      } 
     } 
     }, 
     "script": "abs(new \ 
java.text.SimpleDateFormat('yyyy-MM-dd').parse('1985-10-01').getTime() - \ 
doc['birthdate'].date.getMillis())" 
    } 
    }, 
    "sort": [ 
     { "_score": "asc" } 
    ] 
} 

Более подробная информация о пользовательских озвучивания является http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query/

+0

Wow! Это хорошо работает! Спасибо за вашу идею, как сделать это и предоставить необходимый код! В части скрипта вашего кода есть 2 разрыва строки с «\». Чтобы получить код, мне пришлось удалить разрывы строк и косые черты. Возможно, вы удалите их из своего кода, чтобы каждый мог просто скопировать его. – oliverspies

+0

doc ссылка нарушена :( –