我有一个Postgres客户端发送像
这样的查询SELECT ... FROM "public"."mycontent" "mycontent"
WHERE (strpos(substring("mycontent"."summary" from 1), 'search_string') + 1 - 1 > 0)
到我们的Postgres服务器。我希望客户端使用我的全文搜索功能,但我无法访问客户端的代码。所以我正在寻找一种方法来将上面表格中的所有传入查询重写为:
SELECT ... FROM "public"."mycontent" "mycontent"
WHERE id in full_text_search('search_string')
请注意'search_string'的提取,因此这里不能使用Postgres规则,因为它们不进行此类提取。我希望有人知道任何可以进行查询重写的postgres中间件或代理,还是有其他更好的主意?谢谢。
答案 0 :(得分:2)
我想我必须回答我自己的问题。我使用python gevent套接字编程实现了一个postgres代理服务器来重写查询。请注意,如果连接使用SSL,则此功能无效。
from gevent import socket, server, Greenlet, joinall
def pipe(source_socket, destination_socket, modify=False):
while True:
try:
data = source_socket.recv(1024)
except socket.error, e:
break
else:
if data:
if modify: data = data.replace("limit 10", "limit 1 ")
destination_socket.send(data)
else:
break
def pg_proxy(client_socket, address):
pg_socket = socket.create_connection(("localhost", 5432))
pg_socket.settimeout(300.0)
client_socket.settimeout(300.0)
joinall((
Greenlet.spawn(pipe, client_socket, pg_socket, modify=True),
Greenlet.spawn(pipe, pg_socket, client_socket, modify=False)
))
pg_socket.close()
client_socket.close()
if __name__ == '__main__':
s = server.StreamServer(("localhost", 5433), pg_proxy)
s.serve_forever()
答案 1 :(得分:-1)
如果tou可以将full_text_search重写为在数据库服务器上执行的SQL函数(跟随postgres sql dialect),那我就是好心人。
实际上,postgres提供了一套完整的函数来管理字符串http://www.postgresql.org/docs/9.0/static/functions-string.html