Поисковая система Sphinx и Python API

Я пытаюсь использовать поисковую систему Sphinx с их API Python. Установка прошла нормально. Но когда я использую их Python API, я не получаю полный набор результатов. Я получаю только удостоверение личности? Но когда я использую их двоичный файл ./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 API, я получаю -

>>> 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}

Как получить строковые поля, такие как «заголовок» или «контент», как часть набора результатов?


person Srikar Appalaraju    schedule 11.09.2010    source источник
comment
Query не возвращает содержимое полнотекстовых полей каждого совпадения. Он возвращает только целочисленные атрибуты и идентификаторы документов (по порядку). Вам потребуется выполнить дополнительный SQL-запрос для получения данных документов.   -  person leoluk    schedule 12.09.2010
comment
@leoluk спасибо за ответ! Если то, что вы сказали, верно, мне придется выполнить дополнительные SQL-запросы, чтобы получить мои данные. Можно ли как-нибудь получить их от самого Sphinx? Поскольку, очевидно, его индекс имеет соответствующий текст...   -  person Srikar Appalaraju    schedule 12.09.2010
comment
Да, это возможно, но если бы я знал, как я сделал из этого ответ   -  person leoluk    schedule 13.09.2010
comment
Привет, я запускаю тот же код, но получаю ошибку, пожалуйста, помогите мне.   -  person Sandeep    schedule 18.04.2017
comment
stackoverflow.com/questions/43466220/   -  person Sandeep    schedule 18.04.2017
comment
@SrikarAppal stackoverflow.com/questions/43467783/ Пожалуйста, ответьте на это   -  person Sandeep    schedule 18.04.2017


Ответы (2)


Вы можете использовать sql_field_string - добавьте в свою конфигурацию

source YOUR_SOURCE
{
sql_field_string = title
sql_field_string = content

он будет индексировать данные этих полей, а также хранить эти поля как строковые атрибуты, чтобы вы могли получить их в своем наборе результатов без дополнительного SQL-запроса.

Однако, как и все атрибуты, строковые атрибуты всегда загружаются в память, поэтому у вас может быстро закончиться память вашего ящика.

person tmg_tt    schedule 27.05.2011
comment
Это упоминается в общих ошибках Sphinx sphinxsearch.com/blog/2014/ 10/14/several-common-mystakes, и упоминается использование директивы SHOW_META для просмотра дополнительной информации о том, что было сопоставлено. - person stommepoes; 19.10.2014
comment
@tmg_tt stackoverflow.com/questions/43467783/ пожалуйста и это - person Sandeep; 18.04.2017
comment
Я выполнил этот запрос, но не получил запрос. этот stackoverflow.com/questions/43469933/< /а> - person Jaskaran singh Rajal; 18.04.2017
comment
@tmg_tt, я хочу выделить совпадающий текст в результатах поиска, можем ли мы сделать это всего за один шаг с помощью API? - person zhuj9; 17.02.2020

Хотя это возможно, я не думаю, что это хорошая идея хранить «исходник» в sphinx. Sphinx очень быстр только для специализированной поисковой системы (предоставляя вам только идентификаторы и, возможно, баллы ранжирования - если вам это нужно).

Кстати, официальный API SphinxSearch почти не обновляется, вы можете использовать драйвер/модуль 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()  
person taufikedys    schedule 11.04.2016