Python: оператор if-else будет неверным - PullRequest
0 голосов
/ 09 января 2019

из того, что я видел, это не дубликат, но если это много извинений.

Мне дали несколько примеров запросов Elasticsearch, которые должны быть в состоянии выполнить мой проект, и оттуда им нужно выполнить различные действия над ними. В результате я написал оператор if-else, так что если запрос следует определенному шаблону, то он выполняет определенные действия. Однако 6/8 запросов переходят к оператору else, хотя (насколько я могу судить) их характеристики выполняются в других операторах if / elif.

Запросы

q1 = '{"query": {"bool": {"must": {"bool" : {"should": [{"match": {"Username": "user"}},{"match": {"Action": "action"}}]}}}}}'
q2 = '{"query": {"match" : {"Username" : "user"}}}'
q3 = '{"query": {"bool": {"must": [{"match_phrase": { "Username":"user"}},{"bool": {"should": [{"match": {"Action":"action"}},{"match": {"Action":"action"}}]}},{"range" : {"EventDateTime" :{ "gte": "1546896181000", "lte": "1546982581000" } }}]}}}'
q4 = '{ "query": { "bool": { "must": [ {"match_phrase": { "Username":"user"}}, {"bool": { "should": [ {"match": {"Action":"action"}}, {"match": {"Action":"action"}} ] }}, {"bool":{ "must_not":{"multi_match":{ "type":"phrase", "query":"query", "lenient":true}}}}, {"range" : { "EventDateTime" : { "gte": "1546896181000", "lte": "1546982581000" } }} ] } } }'
q5 = '{ "query": { "bool": { "must": [ {"match_phrase": { "Username":"user"}}, {"bool": { "should": [ {"match": {"Action":"action"}} ] }}, {"range" : { "EventDateTime" : { "gte": "1546896181000", "lte": "1546982581000" } }} ] } } }'
q6 = '{ "query": { "bool": { "must": [ {"match_phrase": { "Username":"user"}}, {"bool": { "should": [ {"match": {"Action":"action"}}, {"match": {"Action":"action"}} ] }}, {"range" : { "EventDateTime" : { "gte": "1546896181000", "lte": "1546982581000" } }} ] } } }'
q7 = '{ "query": { "bool": { "must": [ {"match_phrase": { "SearchRequests":"request"}}, {"range" : { "EventDateTime" : { "gte":1546896181000, "lte":1510703999999 } }} ] } } }'
q8 = '{ "query": { "bool": { "filter":{"multi_match":{"type":"best_fields","query":"test","lenient":true}}, "must": [ {"bool": { "should": [ {"match": {"Action":"action"}}, {"match": {"Action":"action"}} ] }}, {"range" : { "EventDateTime" : { "gte":1546896181000, "lte":1546982581000 } }} ] } } }'

def test_function(query):
    username = ''
    description = ''
    action = ''
    if '{"query": {"bool": {"must": {"bool" : {"should": [{' in query:
        print('I go to the first loop')        
    elif '{"query": {"bool": {"must": [{"match_phrase": {' in query:
        print('I go to the second loop')
    elif '{"query": {"bool": {"filter":\\{"multi_match":{' in query:
        print('I go to the third loop')
    elif '{"query": {"match": {' in query:
        print('I go to the fourth loop')
    else:
        print('I go to the else statement')
    return description, username, action

Результаты (по порядку)

I go to the first loop
I go to the else statement
I go to the second loop
I go to the else statement
I go to the else statement
I go to the else statement
I go to the else statement
I go to the else statement

Что я делаю не так?

1 Ответ

0 голосов
/ 09 января 2019

Вы выполняете поиск конкретной подстроки, и ваш интервал не совпадает. Например, вы пытаетесь сопоставить эти две подстроки:

{ "must": [ {"match_phrase"
{"must": [{"match_phrase"

String in не является приблизительным соответствием и не имеет гибкости для пробелов. Поскольку в ваших запросах есть переменный интервал, вам необходимо учитывать это в своем коде - точное совпадение не будет соответствовать вашим фактическим случаям использования.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...