2

我想使用 Flask 在 Redis 中的值的有效负载中进行搜索。

这是我写的代码

# to fetch value:
localhost/suggestions?prefix=<name>
@app.route('/get')
def get():
    try:
        prefix = request.args.get('prefix')
        n = prefix.strip()
        result= ac.get_suggestions(n, fuzzy = True,with_payloads=True) 
        return(json.dumps([{'id': item.string, 'score': item.score,'payload':item.payload} for item in result]))
    except Exception as e:
        print(e)

我试图搜索有效负载中存在的值,但返回了一个空列表。

我经历了以下事情:

编辑:

进口:

import redis
import redisearch
import json
import string
from flask import Flask
import logging
#flask to expose api's to outside world
from flask import Flask,request,jsonify,render_template
from flask_restx import Resource
from redis import Redis, ConnectionPool
from redisearch.auto_complete import AutoCompleter,Suggestion
from _util import to_string
ac = AutoCompleter('ac')
app = Flask("autocomplete")

新增价值:

# localhost/add?name=<name>
def add():
    try:
        name = request.args.get('name')
        n = name.strip()
        payload = {
                "data": {
                    "value": "1",
                }
            }
        ac.add_suggestions(Suggestion(n,1.0,json.dumps(payload )))

        return "Added Successfully"
    except Exception as e:
        print(e)
        return "Addition Failed"

我什至尝试在网上搜索,但无法找到合适的解决方案。

任何帮助表示赞赏。

4

1 回答 1

0

我在您的代码中看到的唯一错误是您n在两个地方引用了变量,而您的意思可能是prefixand name。例如在函数中add

ac.add_suggestions(Suggestion(n,1.0,json.dumps(payload )))

看起来它应该实际使用name用户提交的内容:

ac.add_suggestions(Suggestion(name ,1.0,json.dumps(payload )))

然后在你的get函数中,使用prefix

result = ac.get_suggestions(prefix, fuzzy = True,with_payloads=True) 

我很困惑为什么这不会引发异常(除非您n在代码的其他地方声明为全局变量)。


我在我的环境中尝试了一些代码:RediSearch version 2.0.12...

>>> from redisearch.auto_complete import AutoCompleter,Suggestion
>>> ac = AutoCompleter('ac')
>>> payload = {
...         "data": {
...             "value": "1",
...         }
...     }

>>> words = ['aoo','boo','soo','rep','mep']
>>> for word in words:
...     ac.add_suggestions(Suggestion(word, 1.0, json.dumps(payload )))
... 

>>> res = ac.get_suggestions('oo', fuzzy = True,with_payloads=True) 
>>> res
[soo, boo, aoo]

现在为您的列表理解:

>>> from pprint import pprint
>>> pprint([{'id': item.string, 'score': item.score,'payload':item.payload} for item in res])
[{'id': 'soo', 'payload': '{"data": {"value": "1"}}', 'score': 1.0},
 {'id': 'boo', 'payload': '{"data": {"value": "1"}}', 'score': 1.0},
 {'id': 'aoo', 'payload': '{"data": {"value": "1"}}', 'score': 1.0},]

这似乎会返回每次命中的有效负载。

于 2021-09-23T17:38:19.307 回答