使用 redis 和 Flask 自动完成
Auto Complete using redis and Flask
我是 Redis 和 Redisearch 的新手。
我想在 Flask 应用程序中使用 Redis 创建一个自动完成功能。
以下是我到目前为止尝试过的方法,
autocomplete.py:
import redis
import redisearch
from flask import Flask,request,jsonify,render_template
app = Flask("autocomplete")
#creating a redis connection
r = redis.Redis(host='localhost', port=6379,db=0)
@app.route('/')
def home():
return "This is Home Page"
#route to add a value to autocomplete list
@app.route('/add')
def addValue():
try:
name = request.args.get('name')
n = name.strip()
for l in range(1,len(n)):
prefix = n[0:l]
r.zadd('compl',{prefix:0})
r.zadd('compl',{n+"*":0})
return "Success"
except:
return "Failed"
#route to get the autocomplete
@app.route('/autocomplete')
def autocomplete():
prefix = request.args.get('prefix')
results = []
rangelen = 50
count=5
start = r.zrank('compl',prefix)
if not start:
return []
while (len(results) != count):
range = r.zrange('compl',start,start+rangelen-1)
start += rangelen
if not range or len(range) == 0:
break
for entry in range:
entry=entry.decode('utf-8')
minlen = min(len(entry),len(prefix))
if entry[0:minlen] != prefix[0:minlen]:
count = len(results)
break
if entry[-1] == "*" and len(results) != count:
results.append(entry[0:-1])
return jsonify(results)
目前,@app.route('/add') 的值和@app.route('/autocomplete') 的前缀是通过 URL 本身获取的。
但是,我希望通过输入文本框获取 @app.route('/autocomplete') 的 prefixes/text 以创建动态自动完成。
如果有人能指导我实现同样的方法,我将不胜感激。
这是一个示例输出:
autocomplete
我也提到了 https://redis.com/ebook/part-2-core-concepts/chapter-6-application-components-in-redis/6-1-autocomplete/ 但无法理解如何实施它
编辑:我在 https://github.com/RediSearch/redisearch-py/blob/master/redisearch/auto_complete.py
找到了解决方案
您可以使用 redisearch 的自动完成器。
Github https://github.com/Redislabs-Solution-Architects/redisearch_demo_and_preso
上提供了使用烧瓶的示例
我是 Redis 和 Redisearch 的新手。 我想在 Flask 应用程序中使用 Redis 创建一个自动完成功能。
以下是我到目前为止尝试过的方法,
autocomplete.py:
import redis
import redisearch
from flask import Flask,request,jsonify,render_template
app = Flask("autocomplete")
#creating a redis connection
r = redis.Redis(host='localhost', port=6379,db=0)
@app.route('/')
def home():
return "This is Home Page"
#route to add a value to autocomplete list
@app.route('/add')
def addValue():
try:
name = request.args.get('name')
n = name.strip()
for l in range(1,len(n)):
prefix = n[0:l]
r.zadd('compl',{prefix:0})
r.zadd('compl',{n+"*":0})
return "Success"
except:
return "Failed"
#route to get the autocomplete
@app.route('/autocomplete')
def autocomplete():
prefix = request.args.get('prefix')
results = []
rangelen = 50
count=5
start = r.zrank('compl',prefix)
if not start:
return []
while (len(results) != count):
range = r.zrange('compl',start,start+rangelen-1)
start += rangelen
if not range or len(range) == 0:
break
for entry in range:
entry=entry.decode('utf-8')
minlen = min(len(entry),len(prefix))
if entry[0:minlen] != prefix[0:minlen]:
count = len(results)
break
if entry[-1] == "*" and len(results) != count:
results.append(entry[0:-1])
return jsonify(results)
目前,@app.route('/add') 的值和@app.route('/autocomplete') 的前缀是通过 URL 本身获取的。 但是,我希望通过输入文本框获取 @app.route('/autocomplete') 的 prefixes/text 以创建动态自动完成。
如果有人能指导我实现同样的方法,我将不胜感激。
这是一个示例输出: autocomplete
我也提到了 https://redis.com/ebook/part-2-core-concepts/chapter-6-application-components-in-redis/6-1-autocomplete/ 但无法理解如何实施它
编辑:我在 https://github.com/RediSearch/redisearch-py/blob/master/redisearch/auto_complete.py
找到了解决方案您可以使用 redisearch 的自动完成器。 Github https://github.com/Redislabs-Solution-Architects/redisearch_demo_and_preso
上提供了使用烧瓶的示例