1# 2# $Id: test.py 2081 2009-11-18 18:13:43Z shodan $ 3# 4 5from sphinxapi import * 6import sys, time 7 8if not sys.argv[1:]: 9 print "Usage: python test.py [OPTIONS] query words\n" 10 print "Options are:" 11 print "-h, --host <HOST>\tconnect to searchd at host HOST" 12 print "-p, --port\t\tconnect to searchd at port PORT" 13 print "-i, --index <IDX>\tsearch through index(es) specified by IDX" 14 print "-s, --sortby <EXPR>\tsort matches by 'EXPR'" 15 print "-a, --any\t\tuse 'match any word' matching mode" 16 print "-b, --boolean\t\tuse 'boolean query' matching mode" 17 print "-e, --extended\t\tuse 'extended query' matching mode" 18 print "-f, --filter <ATTR>\tfilter by attribute 'ATTR' (default is 'group_id')" 19 print "-v, --value <VAL>\tadd VAL to allowed 'group_id' values list" 20 print "-g, --groupby <EXPR>\tgroup matches by 'EXPR'" 21 print "-gs,--groupsort <EXPR>\tsort groups by 'EXPR'" 22 print "-l, --limit <COUNT>\tretrieve COUNT matches (default is 20)" 23 sys.exit(0) 24 25q = '' 26mode = SPH_MATCH_ALL 27host = 'localhost' 28port = 9312 29index = '*' 30filtercol = 'group_id' 31filtervals = [] 32sortby = '' 33groupby = '' 34groupsort = '@group desc' 35limit = 0 36 37i = 1 38while (i<len(sys.argv)): 39 arg = sys.argv[i] 40 if arg=='-h' or arg=='--host': 41 i += 1 42 host = sys.argv[i] 43 elif arg=='-p' or arg=='--port': 44 i += 1 45 port = int(sys.argv[i]) 46 elif arg=='-i': 47 i += 1 48 index = sys.argv[i] 49 elif arg=='-s': 50 i += 1 51 sortby = sys.argv[i] 52 elif arg=='-a' or arg=='--any': 53 mode = SPH_MATCH_ANY 54 elif arg=='-b' or arg=='--boolean': 55 mode = SPH_MATCH_BOOLEAN 56 elif arg=='-e' or arg=='--extended': 57 mode = SPH_MATCH_EXTENDED 58 elif arg=='-f' or arg=='--filter': 59 i += 1 60 filtercol = sys.argv[i] 61 elif arg=='-v' or arg=='--value': 62 i += 1 63 filtervals.append ( int(sys.argv[i]) ) 64 elif arg=='-g' or arg=='--groupby': 65 i += 1 66 groupby = sys.argv[i] 67 elif arg=='-gs' or arg=='--groupsort': 68 i += 1 69 groupsort = sys.argv[i] 70 elif arg=='-l' or arg=='--limit': 71 i += 1 72 limit = int(sys.argv[i]) 73 else: 74 q = '%s%s ' % ( q, arg ) 75 i += 1 76 77# do query 78cl = SphinxClient() 79cl.SetServer ( host, port ) 80cl.SetWeights ( [100, 1] ) 81cl.SetMatchMode ( mode ) 82if filtervals: 83 cl.SetFilter ( filtercol, filtervals ) 84if groupby: 85 cl.SetGroupBy ( groupby, SPH_GROUPBY_ATTR, groupsort ) 86if sortby: 87 cl.SetSortMode ( SPH_SORT_EXTENDED, sortby ) 88if limit: 89 cl.SetLimits ( 0, limit, max(limit,1000) ) 90res = cl.Query ( q, index ) 91 92if not res: 93 print 'query failed: %s' % cl.GetLastError() 94 sys.exit(1) 95 96if cl.GetLastWarning(): 97 print 'WARNING: %s\n' % cl.GetLastWarning() 98 99print 'Query \'%s\' retrieved %d of %d matches in %s sec' % (q, res['total'], res['total_found'], res['time']) 100print 'Query stats:' 101 102if res.has_key('words'): 103 for info in res['words']: 104 print '\t\'%s\' found %d times in %d documents' % (info['word'], info['hits'], info['docs']) 105 106if res.has_key('matches'): 107 n = 1 108 print '\nMatches:' 109 for match in res['matches']: 110 attrsdump = '' 111 for attr in res['attrs']: 112 attrname = attr[0] 113 attrtype = attr[1] 114 value = match['attrs'][attrname] 115 if attrtype==SPH_ATTR_TIMESTAMP: 116 value = time.strftime ( '%Y-%m-%d %H:%M:%S', time.localtime(value) ) 117 attrsdump = '%s, %s=%s' % ( attrsdump, attrname, value ) 118 119 print '%d. doc_id=%s, weight=%d%s' % (n, match['id'], match['weight'], attrsdump) 120 n += 1 121 122# 123# $Id: test.py 2081 2009-11-18 18:13:43Z shodan $ 124# 125