es 正则搜索

从文档上来看,用一个 regexp 查询语句就可以,但是我却无法成功,
依然查不到东西,既然查不到,那就得 Google, 还是未果。
后来注意到,这个些文档都用小写,那么我也用小写,出结果了。
那么问题就解决了,只要小写就可以了。
从客户端来的数据是使用,querystring,因此需要自己设计一个解析器,
用来解析 querystring,然后将要的字段变成正则表达式,放入查询语句,如下:

@app.get('/api//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)

你可能感兴趣的:(es 正则搜索)