查询条件应支持布尔运算符和正则表达式。我已经读过关于Booleano的文章,但是它不支持正则表达式。
如果没有满足此要求的东西,那将是开始构建的最佳技术?
以下示例中的语法只是一个示例,但是它提供的功能应该存在。
is True if ('client/.+' and 'user_a') but (not 'limited' unless ('.+special' or 'godmode'))
等于
is True if 'client/.+' and 'user_a' and (not ('limited' and (not ('.+special' or 'godmode'))))
适用于以下清单
is_true = ['client/chat', 'user_a', 'limited', 'extraspecial']
is_false = ['client/ping', 'user_a', 'limited']
is_false = ['server/chat']
is_false = ['server/ping', 'ping']
我设法使用pyparsing模块解决了这个问题。
import re
import pyparsing
class BoolRegEx(object):
def Match(self, tags=[], query=""):
self.tags = tags
if ' ' not in query:
return self.Search(query)
else:
return pyparsing.operatorPrecedence(
pyparsing.Word(pyparsing.printables, excludeChars="()"), [
(pyparsing.Literal("NOT"), 1, pyparsing.opAssoc.RIGHT, self.Not),
(pyparsing.Literal("OR"), 2, pyparsing.opAssoc.LEFT, self.Or),
(pyparsing.Literal("AND"), 2, pyparsing.opAssoc.LEFT, self.And),
]
).parseString(query, parseAll=True)[0]
def Search(self, a):
try:
regex = re.compile(a.replace("<<", "#~").replace(">>", "~#").replace(">", ")").replace("<", "(").replace("#~", "<").replace("~#", ">"))
for tag in self.tags:
match = regex.match(tag)
if match and len(match.group(0)) == len(tag):
return True
return False
except:
raise
def And(self, t):
for a in t[0][0::2]:
if isinstance(a, basestring):
v = self.Search(a)
else:
v = bool(a)
if not v:
return False
return True
def Or(self, t):
for a in t[0][0::2]:
if isinstance(a, basestring):
v = self.Search(a)
else:
v = bool(a)
if v:
return True
return False
def Not(self, t):
a = t[0][1]
if isinstance(a, basestring):
return not self.Search(a)
else:
return not bool(a)
print BoolRegEx().Match(['client/chat', 'user_a', 'limited', 'extraspecial'], "client/.+ AND user_a AND NOT ( limited AND NOT ( .+<r|i>special OR godmode ) )")
# False
print BoolRegEx().Match(['client/chat', 'user_a', 'limited', 'superspecial'], "client/.+ AND user_a AND NOT ( limited AND NOT ( .+<r|i>special OR godmode ) )")
# True
为了避免发生冲突,我必须用<>替换regexp(),但是目前所有这些似乎都是最好的解决方案。
问题内容: 我想在elasticsearch中编写一个查询,这样它只会给出字符串从特定单词开始的结果,例如,如果我要搜索“ Donald”,则我现在有一个字符串“ Donald Duck”,而另一个字符串是“ Alan Donald” “与以下查询 那么结果应该是“ Donald Duck”而不是“ Alan Donald”,因为在“ Donald Duck”中,它以“ Donald”开头。现在有
我在代码中使用条件查询。它总是激发 相反,我想忽略查询中的一列(字段),因为该字段以字节形式存储了大量数据。导致性能问题。 有谁能给出一个主意吗? 一些更新 我在查询中添加了一个投影,它创建了一个类似... 现在问题就像..中的未知列“y4_”以及y8_和y5_的相同错误意味着关闭它给出错误的所有内容。 我把它修改成像... 而且奏效了。但是不知道在HQL里面怎么修改?
但是我在遗留系统上有一个具有许多属性的对象,我只想选择几个,尽管我知道选择几个属性通常是很快的。 如果不使用条件查询,这可能吗?
我正在使用Spring数据jpa来创建服务。使用我从多个表中提取记录。我在模型类中使用了映射。模型类与和进行映射。相符。 我只想从建筑中选择建筑名称。 谁能告诉我怎么办? 查询DSL 结果
问题内容: 我在代码中使用了条件查询。它总是会开火 相反,我想忽略查询中的一列(字段),因为该字段以字节为单位存储大量数据。这会导致性能问题。 有人可以对此提出想法吗? 一些更新 我在查询中添加了一个投影,它创建了一个查询,例如… 现在的问题就像.. 和y8_的相同错误,y5_表示所有接近它给出错误的地方。 我将其修改为Query … 而且有效。但是我不知道如何在HQL中对其进行修改? 问题答案:
问题内容: 实现目标: 我想要名称属性包含列表中任何单词的所有对象。 我有: 例如: 然后应返回具有该名称的对象,因为word2在列表中。 请帮忙! 问题答案: 您可以使用对象来构造如下查询: 编辑: 是一种奇特的写作方式 您还可以使用显式的for循环来构造对象。