Я хотел бы найти все объекты, у которых есть значение года, которое начинается с 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
если кто-нибудь может придумать лучшее решение, пожалуйста, дайте мне знать
Если ваше поле - год, я предполагаю, что вы хотите найти все годы больше 2000. Возможно, вы можете использовать запрос диапазона? –