从文档上来看,用一个 regexp 查询语句就可以,但是我却无法成功,
依然查不到东西,既然查不到,那就得 Google, 还是未果。
后来注意到,这个些文档都用小写,那么我也用小写,出结果了。
那么问题就解决了,只要小写就可以了。
从客户端来的数据是使用,querystring,因此需要自己设计一个解析器,
用来解析 querystring,然后将要的字段变成正则表达式,放入查询语句,如下:
@app.get('/api/<type:(internal|external|selected)_product>/search/')
async def search_product_with_type(request, type):
q = request.args.get('q', None)
query = None
if q:
query = {}
idx0 = q.find('product_number:')
if idx0 > -1:
idx1 = q.find(':', idx0) + 1
s = q[idx1]
if s == '"':
idx2 = q.find('"', idx1 + 1)
elif s == "'":
idx2 = q.find("'", idx1 + 1)
else:
idx2 = q.find(' ', idx1 + 1)
if idx2 == -1:
idx2 = len(q)
value = q[idx1 + 1:idx2].strip().lower()
if value[0] == '/':
value = value[1:-1]
else:
value = f'.*{value}.*'
query = {
'regexp': {
'product_number': {
'value': value,
'flags': 'ALL',
},
},
}
q = q[:idx0] + q[idx2 + 1:]
q = q.strip().lower()
if q:
query = {
'bool': {
'must':
[query, {
'simple_query_string': {
'query': q,
}
}]
}
}
else:
query = {
'simple_query_string': {
'query': q,
}
}
from_ = int(request.args.get('from', '0'))
size = int(request.args.get('size', '100'))
sort = request.args.get('sort', '_score')
search = es.get_search_product_with_type(type)
ret = await search(body={'query': query},
from_=from_,
size=size,
sort=sort)
ret['hits'] = await fill_document(ret['hits'])
return json(ret)
网友评论