Differences between revisions 16 and 17
Revision 16 as of 2007-01-26 16:20:54
Size: 3263
Editor: wangzhen
Comment:
Revision 17 as of 2007-01-26 16:21:59
Size: 3265
Editor: wangzhen
Comment:
Deletions are marked like this. Additions are marked like this.
Line 63: Line 63:
   doc.add_term(file[-4:])#把文件名做为一个关键词    . doc.add_term(file[-4:])#把文件名做为一个关键词

Xapian 初体验之 hello xapian

文件夹结构:

~/helloxapian

~/helloxapian/indexfiles.py

~/helloxapian/search.py

~/helloxapian/test

~/helloxapian/test/hello.txt

~/helloxapian/test/world.txt

~/helloxapian/test/abc.txt

hello.txt文件内容: world.txt文件内容: abc.txt文件内容: indexfiles.py文件:

#!/usr/bin/env python

#coding=utf-8

import sys

import xapian

import string

from os import listdir

import re

rex=re.compile('[a-zA-Z0-9]+') #给英文内容进行简单的分词,暂时不涉及中文

MAX_TERM_LENGTH = 64 #设置一个关键词的最大长度

DBPATH='indexdb' #索引文件目录

if len(sys.argv) < 2:

  • print >> sys.stderr, "缺少参数,请提供需要建立索引的目录"

  • sys.exit(1)

try:

  • database = xapian.WritableDatabase(DBPATH, xapian.DB_CREATE_OR_OPEN)

  • stemmer = xapian.Stem("english")#针对英文进行处理
  • for file in listdir(sys.argv[1]):
    • if file[-4:]=='.txt':
    • filename=sys.argv[1] + '/' + file
    • try:
      • fr=open(filename,'r')
      • content=fr.read()
      • fr.close()
      • content=string.strip(content)
      • doc = xapian.Document()#新建一个Document,相当于一条记录
      • doc.set_data(content)
      • doc.add_value(0,filename)#添加一个value,记录文件名
      • doc.add_term(file[-4:])#把文件名做为一个关键词
      • pos = 0
      • terms=rex.findall(content)#从文本内容里找出每一个词
      • for term in terms:
        • if len(term) > MAX_TERM_LENGTH:

          • term=termMAX_TERM_LENGTH
          doc.add_posting(stemmer(term.lower()),pos)#添加关键词,并记录关键词所在位置
        • pos += 1
        database.add_document(doc)
      except:
      • pass

except Exception, e:

  • print >> sys.stderr, "Exception: %s" % str(e)

  • sys.exit(1)

现在打开终端窗口,到~/helloxapian目录中执行python indexfiles.py test

就可以把test目录下的所有.txt文件都建立索引。

此时在~/helloxapian下会多出一个indexdb目录,这就是存储索引文件的目录。

search.py文件内容:

#!/usr/bin/env python

#coding=utf-8

import sys

import xapian

if len(sys.argv) < 2:

  • print >> sys.stderr, "缺少参数,请提供要查询的关键词"

  • sys.exit(1)
  • DBPATH='indexdb'
  • try:
    • db = xapian.Database(DBPATH) #打开索引文件
    • enquire = xapian.Enquire(db) #Enquire类是负责执行查询的
    • stemmer = xapian.Stem('english')
    • terms = []
    • for term in sys.argv[1:]:
      • terms.append(stemmer(term.lower())) #将命令行参数中的所有关键词添加到要查找的关键词列表中
      query = xapian.Query(xapian.Query.OP_OR,terms) #Query是查找条件类,OP_OR说明各关键词之关的组合关系,还有OP_AND等等 enquire.set_query(query) #设置查询条件
    • mset=enquire.get_mset(0,10) #获取前十条结果
    • print '共搜索到结果:' + str(mset.get_matches_estimated())
    • for match in mset:
      • doc=match[xapian.MSET_DOCUMENT]#得到一个Docuemnt对像 print '=========\r\n文件名:%s\r\n摘要:%s...' % (doc.get_value(0),doc.get_data()[:80])
    except Exception, e:
    • print >> sys.stderr, "Exception: %s" % str(e)

    • sys.exit(1)

xapian004 (last edited 2009-12-25 07:15:29 by localhost)