2016-06-06 6 views
0

Я хотел бы найти все объекты, у которых есть значение года, которое начинается с 20 ... поэтому я хотел бы искать 20 *, где * - это дикая карта. Я пытался что-то вродеelasticsearch: использование подстановочных знаков для целых значений

'match_phrase_prefix': { 'year': { 'query': '20*', 'max_expansions': 50}} 

, но я предполагаю, что это работает только для строк. Как бы это сделать для целых чисел?

EDIT: Я нашел решение ... его не очень, но это работает

year_query = '20' 
if len(str(year_query)) < 4: 
    try: 
     low_year, high_year = extend_year(int(year_query)) 
     filter_list.append({"range": {"year": {"gte": low_year, "lte": high_year}}}) 
    except ValueError: 
     print "Not a valid input for year" 
     pass 
else: 
    for year in year_query.split(','): 
     if '-' in year: 
      year_range = year.split('-') 
      high_year = year_range[1].strip() 
      if len(high_year) < 4: 
       low_year, high_year = extend_year(high_year) 
       try: 
        filter_list.append({"range" : {"year" : {"gte" : int(year_range[0].strip()),"lte" : int(high_year),"format": "yyyy"}}}) 
       except ValueError: 
        print "Not a valid input for year" 
        pass 
      else: 
       try: 
        filter_list.append({ "match": {"year": int(year.strip()) }}) 
       except ValueError: 
        print "Not a valid input for year" 
        pass 

с функцией

def extend_year(input_year): 
    length = len(str(input_year)) 
    if length == 4: 
     return input_year, 0 
    elif length == 3: 
     return input_year*10, int(str(input_year) + '9') 
    elif length == 2: 
     return input_year*100, int(str(input_year) + '99') 
    elif length == 1: 
     return input_year*1000, int(str(input_year) + '999') 
    elif length == 0: 
     return 0, 9999 
    else: 
     return input_year, 0 

если кто-нибудь может придумать лучшее решение, пожалуйста, дайте мне знать

+1

Если ваше поле - год, я предполагаю, что вы хотите найти все годы больше 2000. Возможно, вы можете использовать запрос диапазона? –

ответ

3

Это должно работать

'range': { 'year': { 'gte': 2000, 'max_expansions': 50}} 
+0

и, конечно, 'lt': 2100;) –

+0

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

+0

Это численный диапазон, поэтому он должен соответствовать только номерам больше 2000. Тогда вы могли бы «lt» для 2100. Хотя я смущен тем, что вы действительно хотите. –

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