Sphinx搜索引擎与Python API

10 投票
2 回答
11369 浏览
提问于 2025-04-16 04:01

我正在尝试使用Sphinx搜索引擎的Python接口。安装过程很顺利。但是当我使用他们的Python接口时,我没有得到完整的结果集。我只得到了ID?而当我使用他们的./search二进制文件在./bin目录下时,我得到了整个索引的内容。

使用cpp ./search二进制文件时 -

./search test

1. document=1, weight=1, group_id=1, date_added=Sat Sep 11 07:42:38 2010, title=2
    id=1
    group_id=1
    group_id2=5
    date_added=2010-09-11 07:42:38
    title=test one
    content=this is my test document number one. also checking search within phrases.

但是当我使用Python接口时,我得到的是 -

>>> import sphinxapi
>>> client = sphinxapi.SphinxClient()
>>> client.SetServer('127.0.0.1', 9312)
>>> client.Query('test')
{'status': 0, 'matches': [{'id': 1, 'weight': 1, 'attrs': {'date_added': 1284171158, 'group_id': 1, 'title': 2}}, {'id': 2, 'weight': 1, 'attrs': {'date_added': 1284171158, 'group_id': 1, 'title': 3}}, {'id': 4, 'weight': 1, 'attrs': {'date_added': 1284171158, 'group_id': 2, 'title': 1}}], 'fields': ['content'], 'time': '0.022', 'total_found': 3, 'warning': '', 'attrs': [['group_id', 1], ['date_added', 2], ['title', 3]], 'words': [{'docs': 6, 'hits': 6, 'word': 'test'}], 'error': '', 'total': 3}

我该如何将像'title'或'content'这样的字符串字段作为结果集的一部分获取呢?

2 个回答

10

虽然这样做是可能的,但我觉得把“源数据”存储在 Sphinx 里并不是个好主意。Sphinx 主要是一个专门的搜索引擎,它的速度非常快,只会给你一些 ID 和可能的排名分数(如果你需要的话)。

顺便提一下,官方的 SphinxSearch API 更新得很少,你实际上可以使用 MySQL 的驱动程序或模块(比如 pymysql)。下面是一个例子:

import pymysql
db = pymysql.connect(host='127.0.0.1',port=9301,user='',passwd='',charset='utf8',db='')
cur = db.cursor()
qry='SELECT id,weight() FROM idx_name WHERE MATCH(\'"your Query"/1\') LIMIT 10 OPTION ranker=SPH04'
cur.execute(qry);row = cur.fetchall()
print(row)
cur.close();db.close()  
4

你可以使用 sql_field_string - 把它加到你的配置里。

source YOUR_SOURCE
{
sql_field_string = title
sql_field_string = content

这样做会把这些字段的数据建立索引,同时也会把这些字段当作字符串属性存储,这样你在结果集中就可以直接获取它们,而不需要额外的 SQL 查询。

不过要注意,因为所有的字符串属性都会加载到内存中,所以这可能会让你的内存很快用完。

撰写回答