Python: запрос с подстановочными знаками в Elasticsearch

Я хочу запросить поле с помощью подстановочного знака в Elasticsearch, но проблема в том, что строка поиска хранится в переменной и недоступна статически. Предполагаемый запрос:

body={"query": {"wildcard": {"Name": { "value" : "Vi?????" }}}}

где строка поиска Vi недоступна во время компиляции. Он будет предоставлен пользователем. Скажем, он хранится в некоторой переменной str (= Vi). Как мне сформулировать запрос, используя str и ?s ?


person VITTHAL BHANDARI    schedule 23.06.2020    source источник
comment
Возможно, вам стоит уточнить вопрос. Вас беспокоит NoSQL-инъекция? Или вы не хотите выполнять поиск по префиксу?   -  person ymonad    schedule 23.06.2020
comment
У вас есть запрос в переменной?   -  person Gibbs    schedule 23.06.2020
comment
Да. строка поиска хранится в переменной, и я хочу создать запрос с этой строкой. В основном пользователь должен получить результаты, соответствующие введенным им данным. Очевидно, я не могу написать статический запрос. Как мне поступить?   -  person VITTHAL BHANDARI    schedule 23.06.2020


Ответы (1)


Вы должны использовать конкатенацию + в python.

И вам нужно избегать двойных кавычек. Есть много способов сделать это. Я предпочитаю escaping double quotes as \"

searchWord ="Vi";
query = "{\"query\": {\"wildcard\": {\"Name\": { \"value\" : \"" + searchWord + "?????\" }}}}";
print (query);

searchWord — это то, что вы получаете от пользователя. Я жестко запрограммировал это.

query это тот, который вам нужно сформировать. Вот как я это сделал \"" + searchWord + "?????\"

Пожалуйста, проверьте и предоставьте любую информацию, которую мне нужно рассмотреть.

ИЗМЕНИТЬ:

searchWord ="Vi";
x = 2;
query = "{\"query\": {\"wildcard\": {\"Name\": { \"value\" : \"" + "[a-z]{" + str(x) +"}" + searchWord + "?????\" }}}}";
print (query);
person Gibbs    schedule 23.06.2020
comment
Я думаю об использовании регулярного выражения вместо подстановочного знака для написания более простого запроса. Это правильный способ написания выражения? result = es.search(index="my-index", body="{\"query\" : {\"regexp\": {\"Name\": \" "+str+".*\" }}})" - person VITTHAL BHANDARI; 23.06.2020
comment
Вам просто нужно заменить wildcard на regexp - person Gibbs; 23.06.2020
comment
Спасибо. Решение сработало. Но у меня есть еще одна проблема (надеюсь, последняя). Регулярное выражение должно содержать еще одну динамическую переменную — количество символов, которые должны встретиться до начала сопоставления строк. - person VITTHAL BHANDARI; 23.06.2020
comment
Например, рабочий запрос, который я написал, был примерно таким: [a-z]{2}+searchWord+.* Здесь я привязываю свое searchWord таким образом, чтобы оно отображалось как подстрока, начинающаяся ровно с 3-го символа (начиная с 2 символов). может быть что угодно). Как мне сформулировать приведенный выше запрос, если 2 также является входной переменной? - person VITTHAL BHANDARI; 23.06.2020
comment
Та же escape-последовательность. Заключите в двойные кавычки и соедините с помощью + - person Gibbs; 23.06.2020
comment
Следующий фрагмент кода прекрасно работает: result = es.search(index="my-index", body={"query" : {"regexp": {"Name": "[a-z]{2}"+str+".*" }}}) Можете ли вы помочь мне заменить 2 на переменную (скажем, число)? Я сталкиваюсь с ошибками, когда пытаюсь использовать escape-последовательности. - person VITTHAL BHANDARI; 23.06.2020
comment
Конечно. Виноват. должен был привести тип к строке. Большое спасибо. Вы решили много моих проблем. - person VITTHAL BHANDARI; 23.06.2020