【问题标题】:Python : wildcard query in ElasticsearchPython:Elasticsearch 中的通配符查询
【发布时间】:2020-10-13 06:21:05
【问题描述】:

我想在 Elasticsearch 中使用通配符查询一个字段,但问题是搜索字符串存储在一个变量中并且不能静态使用。 预期的查询是:

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

其中搜索字符串“Vi”在编译时不可用。它将由用户提供。假设它存储在某个变量 str (= "Vi") 中。我应该如何使用 str 和 "?"s 制定查询?

【问题讨论】:

  • 也许你应该详细说明这个问题。您是否担心 NoSQL 注入?或者不想进行前缀搜索?
  • 您的查询是否包含在变量中?
  • 是的。搜索字符串存储在一个变量中,我想用该字符串创建一个查询。基本上用户应该得到与他/她给出的输入相对应的结果。显然我不能写一个静态查询。我应该如何进行?

标签: python elasticsearch wildcard elasticsearch-dsl elasticsearch-query


【解决方案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);

【讨论】:

  • 我正在考虑使用正则表达式而不是通配符来编写更简单的查询。这是写表达式的正确方法吗? result = es.search(index="my-index", body="{\"query\" : {\"regexp\": {\"Name\": \" "+str+".*\" }}})"
  • 您只需将wildcard 替换为regexp
  • 谢谢。解决方案奏效了。但我手头还有另一个问题(希望是最后一个)。正则表达式应该包含另一个动态变量 - 在字符串匹配开始之前应该出现的字符数。
  • 例如,我写的一个工作查询是这样的:"[az]{2}"+searchWord+".*" 在这里,我锚定了我的 searchWord,使其显示为从第 3 个字符开始的子字符串(开头 2 个字符可以是任何字符)。我应该如何用“2”作为输入变量来制定上述查询?
  • 当然。我的错。应该将 int 类型转换为字符串。非常感谢。你解决了我的很多问题。
猜你喜欢
  • 2021-05-22
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多