sphinx 其他的数据源

来源:互联网 发布:tplink访客网络 编辑:程序博客网 时间:2024/05/16 09:52
有时候我们在开发的时候碰到的数据库不是  mysql  而是 mssql 或者 mongodb  等等。那么还能用 sphinx 。其实是可以的。 俺公司遇到个就是 要在  FB 系统下 的sphinx 去索引   win 服务器下的mssql 。 我是这样做的。废话不多讲了。给例子。。。。  

核心单词: xmlpipe2 (通杀所有语言和数据库做sphinx 的问题)。  其实就是。你通过任何程序去  读取数据库信息然后构造一定格式的xml 文档 让 sphinx 去建索引。 就那么简单。

当时项目我用的是 python来实现。当然了 PHP 实现也很容易,为了预防返回的XML过大,所以PHP建议使用比较底层的xml解释器 :  xmlwriter 。

其实python 也有类似的库。叫: loxun 。 是利用stringIO 来实现的。。 

PHP 的请看官方推荐的办法:  http://jetpackweb.com/blog/2009/08/16/sphinx-xmlpipe2-in-php-part-ii/

python 的我就帖我写的  例子 :  python -> mssql - > xml -> sphinx 。

  1. # coding=utf-8
  2. from loxun import XmlWriter
  3. from StringIO import StringIO
  4. import pymssql

  5. conn = pymssql.connect(host=r'MySe2k', user='map', password='ci@com', database='CeMp',as_dict=True,charset='utf8')

  6. cur = conn.cursor()

  7. out = StringIO()
  8. xml = XmlWriter(out)

  9. xml.addNamespace("sphinx","http://www.beihai365.com")
  10. #---docset
  11. xml.startTag("sphinx:docset")
  12. # --- schema
  13. xml.startTag("sphinx:schema")
  14. #--- field
  15. xml.tag("sphinx:field",{"name":"content"})
  16. #--- /field
  17. xml.endTag() 
  18. #--- /schema

  19. #-#---  wenwen--document
  20. cur.execute('SELECT COUNT(*) FROM MapObjectInfo')
  21. tj = cur.fetchone()[0]

  22. pNum = 1000
  23. cutSqlNum = pNum
  24. _p = 1
  25. zNum = 0

  26. while True:
  27.         if (tj-zNum)<pNum:
  28.                 cutSqlNum = tj-zNum

  29.         zNum = int(pNum * _p)
  30.         cur.execute('SELECT * FROM (select top %d* from (select top %d ID,Name from MapObjectInfo ORDER BY ID DESC)t1 ORDER BY ID)t2 ORDER BY ID DESC' % (cutSqlNum,zNum))
  31.         #print 'SELECT * FROM (select top %d* from (select top %d ID,Name from MapObjectInfo ORDER BY ID DESC)t1 ORDER BY ID)t2 ORDER BY ID DESC\n' % (cutSqlNum,zNum)
  32.         row = cur.fetchone_asdict()
  33.         while row:
  34.                 if row['ID'] == 0:
  35.                         row = cur.fetchone_asdict()
  36.                         continue
  37.                 xml.startTag("sphinx:document",{"id":row['ID']})
  38.                 xml.startTag("content")
  39.                 xml.text(row['Name'])
  40.                 xml.endTag()
  41.                 xml.endTag()
  42.                 row = cur.fetchone_asdict()
  43.         _p = _p + 1

  44.         if zNum > tj:
  45.                 break
  46. #---#---  /wenwen /document
  47. conn.close()
  48. xml.endTag()
  49. #--- /docset
  50. xml.close()

  51. print out.getvalue()
复制代码




然后在看下 sphinx 这边建索引配置(只是简单的测试例子,如果要用在生产环境,还需要做增量和区段查询等。。。。。 -_-!不过呢这个例子小站也可以用了~):

  1. source testxml
  2. {
  3.     type = xmlpipe2
  4.     xmlpipe_command = python /tmp/testx.py
  5. }

  6. index testxml
  7. {
  8.         source                                  = testxml
  9.         path                                    = /data/sphinx/testxml
  10.         docinfo                                 = extern
  11.         morphology                              = none
  12.         min_word_len                            = 1
  13.         charset_type                            = utf-8
  14.         min_prefix_len                          = 0
  15.         html_strip                              = 1
  16.         charset_table                           = 0..9, A..Z->a..z, _, a..z, U+410..U+42F->U+430..U+44F, U+430..U+44F
  17.         ngram_len                               = 1
  18.         ngram_chars                             = U+3000..U+2FA1F
  19. }

  20. indexer
  21. {
  22.         mem_limit                               = 128M
  23. }

  24. searchd
  25. {
  26.         port                                    = 4412
  27.         log                                     = /data/log/sphinxsearch/searchd.log
  28.         query_log                               = /data/log/sphinxsearch/query.log
  29.         read_timeout                            = 5
  30.         max_children                            = 30
  31.         pid_file                                = /data/log/sphinxsearch/searchd.pid
  32.         max_matches                             = 1000
  33.         seamless_rotate                         = 1
  34.         preopen_indexes                         = 0
  35.         unlink_old                              = 1
  36. }
复制代码




那么有点同学问: 那 mongodb 和 sphinx  怎么弄? 
这回童鞋们应该明白了吧。。如果还不明白当我没说过。。哈哈
原创粉丝点击