`

PyLucene-学习-01安装及建索引、查询

阅读更多

PyLucene是Java版Lucene的Python版封装。这个工具的目标是让Python使用Lucene的文本索引和搜索能力。它与Java版Lucene的最新版本是兼容的。PyLucene把一个带有JAVA VM的Lucene嵌入到Python进程中。你可以在http://lucene.apache.org/pylucene/网站上找到更多的PyLucene详情。

本文中,我们将描述如何使用PyLucene构建搜索索引和查询一个搜索索引。你可以从先前的文档看到Lucene3.0安装说明。

PyLucene-Win32下的安装包可以从下面的网址中找到:

http://code.google.com/a/apache-extras.org/p/pylucene-extra/downloads/list

注:使用PyLucene必须安装Java SDK

一、 使用PyLucene创建索引

使用下面的代码基于PyLucene来创建索引

#!/usr/bin/env python
 import os,sys,glob
 import lucene
 from lucene import SimpleFSDirectory, System, File, Document, Field, \
 StandardAnalyzer, IndexWriter, Version

 """
 Example of Indexing with PyLucene 3.0
 """

def luceneIndexer(docdir,indir):
         """
         IndexDocuments from a directory
         """

         lucene.initVM()
         DIRTOINDEX= docdir
         INDEXIDR= indir
         indexdir= SimpleFSDirectory(File(INDEXIDR))
         analyzer= StandardAnalyzer(Version.LUCENE_30)
         index_writer= IndexWriter(indexdir,analyzer,True,\
         IndexWriter.MaxFieldLength(512))
         for tfile in glob.glob(os.path.join(DIRTOINDEX,'*.txt')):
                   print"Indexing: ", tfile
                   document= Document()
                   content= open(tfile,'r').read()
                   document.add(Field("text",content,Field.Store.YES,\
                            Field.Index.ANALYZED))
                   index_writer.addDocument(document)
                   print"Done: ", tfile
         index_writer.optimize()
         printindex_writer.numDocs()
         index_writer.close()

 你必须提供两个参数给luceneIndexer()函数。

1)  一个保存被索引文档的目录路径;

2)  一个索引存储的目录路径。

 

二、使用Pylucene查询

下面的代码用于查询Pylucene创建的索引。

#!/usr/bin/env python
 import sys
 import lucene
 from lucene import SimpleFSDirectory, System, File, Document, Field,\
 StandardAnalyzer, IndexSearcher, Version,QueryParser

 """
 PyLucene retriver simple example
 """
 INDEXDIR = "./MyIndex"

def luceneRetriver(query):
         lucene.initVM()
         indir= SimpleFSDirectory(File(INDEXDIR))
         lucene_analyzer= StandardAnalyzer(Version.LUCENE_30)
         lucene_searcher= IndexSearcher(indir)
         my_query= QueryParser(Version.LUCENE_30,"text",\
         lucene_analyzer).parse(query)
         MAX= 1000

total_hits =lucene_searcher.search(my_query,MAX)

         print"Hits: ",total_hits.totalHits

         forhit in total_hits.scoreDocs:

                   print"Hit Score: ",hit.score, "Hit Doc:",hit.doc, "HitString:",hit.toString()

                   doc= lucene_searcher.doc(hit.doc)

                   printdoc.get("text").encode("utf-8")

 luceneRetriver("really coolrestaurant")

 在代码中,我们认为的指定索引目录为INDEXDIR=./MyIndex,你也可以使用命令行参数(sys.argv)来接收索引目录来替换它。

 

当使用函数luceneRetriver()时,你必须给一个查询作为参数

 

=====================================================

另外还有一个实例:

PyLucene Samples目录下的IndexFiles.py和SearchFiles.py完成了对指定目录下的.txt文件内容进行索引,我们可以修改两个文件实现上面的功能。另外为了能够检索简体中文、繁体中文文件名、目录名对文件名和目录名进行了Unicode编码。源码如下:

IndexFiles.py

# -*- coding:GB2312 -*-
import sys, os, PyLucene, threading, time
from datetime import datetime

"""
This class is loosely based on the Lucene (java implementation) demo class 
org.apache.lucene.demo.IndexFiles.  It will take a directory as an argument
and will index all of the files in that directory and downward recursively.
It will index on the file path, the file name and the file contents.  The
resulting Lucene index will be placed in the current directory and called
'index'.
"""

class Ticker(object):

    def __init__(self):
        self.tick = True

    def run(self):
        while self.tick:
            sys.stdout.write('.')
            sys.stdout.flush()
            time.sleep(1.0)

class IndexFiles(object):
    """Usage: python IndexFiles <doc_directory>"""

    def __init__(self, root, storeDir, analyzer):

        if not os.path.exists(storeDir):
            os.mkdir(storeDir)
        store = PyLucene.FSDirectory.getDirectory(storeDir, False)
        writer = PyLucene.IndexWriter(store, analyzer, False)
        writer.setMaxFieldLength(1048576)
        self.indexDocs(root, writer)
        ticker = Ticker()
        print 'optimizing index',
        threading.Thread(target=ticker.run).start()
        writer.optimize()
        writer.close()
        ticker.tick = False
        print 'done'

    def indexDocs(self, root, writer):
        for root, dirnames, filenames in os.walk(root):
            print root
            try:
                sroot = unicode(root, 'GBK')
                print sroot
            except:
                print "*****************************unicode error"
                print root
                continue

            #add dir
            doc = PyLucene.Document()
            doc.add(PyLucene.Field("path", sroot,
                                   PyLucene.Field.Store.YES,
                                   PyLucene.Field.Index.UN_TOKENIZED))

            doc.add(PyLucene.Field("name", sroot,
                                   PyLucene.Field.Store.YES,
                                   PyLucene.Field.Index.TOKENIZED))
            writer.addDocument(doc)
            
            for filename in filenames:
                try:
                    filename = unicode(filename, 'GBK')
                except:
                    print "*****************************unicode error"
                    print filename
                    continue
                print "adding", filename
                try:
                    
                    #path = unicode(root, 'GB2312')#
                    #
                    path =os.path.join(sroot, filename)
                    #file = open(path)
                    #contents = unicode(file.read(), 'iso-8859-1')
                    #contents = unicode(file.read(), 'GBK')
                    #file.close()
                    doc = PyLucene.Document()

                    doc.add(PyLucene.Field("path", path,
                                           PyLucene.Field.Store.YES,
                                           PyLucene.Field.Index.UN_TOKENIZED))

                    doc.add(PyLucene.Field("name", filename,
                                           PyLucene.Field.Store.YES,
                                           PyLucene.Field.Index.TOKENIZED))
                    '''
                    if len(contents) > 0:
                        doc.add(PyLucene.Field("contents", contents,
                                               PyLucene.Field.Store.YES,
                                               PyLucene.Field.Index.TOKENIZED))
                    else:
                        print "warning: no content in %s" % filename
                    '''
                    writer.addDocument(doc)
                except Exception, e:
                    print "Failed in indexDocs:", e
__debug = 0
if __name__ == '__main__':
    if __debug != 1:
        if len(sys.argv) < 2:
            print IndexFiles.__doc__
            sys.exit(1)

    print 'PyLucene', PyLucene.VERSION, 'Lucene', PyLucene.LUCENE_VERSION
    start = datetime.now()
    try:
        if __debug != 1:
            IndexFiles(sys.argv[1], "index", PyLucene.StandardAnalyzer())
        else:
            IndexFiles(r'c:/testccc', "index", PyLucene.StandardAnalyzer())
        end = datetime.now()
        print end - start
    except Exception, e:
        print "Failed: ", e

 SearchFiles.py

from PyLucene import QueryParser, IndexSearcher, StandardAnalyzer, FSDirectory
from PyLucene import VERSION, LUCENE_VERSION

"""
This script is loosely based on the Lucene (java implementation) demo class 
org.apache.lucene.demo.SearchFiles.  It will prompt for a search query, then it
will search the Lucene index in the current directory called 'index' for the
search query entered against the 'contents' field.  It will then display the
'path' and 'name' fields for each of the hits it finds in the index.  Note that
search.close() is currently commented out because it causes a stack overflow in
some cases.
"""
def run(searcher, analyzer):
    while True:
        print
        print "Hit enter with no input to quit."
        command = raw_input("Query:")
        command = unicode(command, 'GBK')
        if command == '':
            return

        print
        print "Searching for:", command
        #query = QueryParser("contents", analyzer).parse(command)
        query = QueryParser("name", analyzer).parse(command)
        hits = searcher.search(query)
        print "%s total matching documents." % hits.length()

        for i, doc in hits:
            print 'path:', doc.get("path"), 'name:', doc.get("name")


if __name__ == '__main__':
    STORE_DIR = "index"
    print 'PyLucene', VERSION, 'Lucene', LUCENE_VERSION
    directory = FSDirectory.getDirectory(STORE_DIR, False)
    searcher = IndexSearcher(directory)
    analyzer = StandardAnalyzer()
    run(searcher, analyzer)
    searcher.close()

 建立索引,运行:

python IndexFiles.py c:/

 

查找的时候,运行:

python SearchFiles.py

 

如果只查找一个关键词则直接输入;如果想同时查找两个关键词,如Python 网络,则输入:Python AND 网络;如果想查找Python或网络则:Python 网络,也可以Python OR 网络。

 

 

 

分享到:
评论

相关推荐

    pylucene-3.0.0-1-src.tar.gz

    PyLucene的安装通常涉及下载"pylucene-3.0.0-1"压缩包,解压后包含"pylucene-3.0.0-1"目录,这个目录下包含了必要的源码和构建脚本。在安装过程中,需要确保系统已经安装了JCC(Java to Python Compiler),这是...

    pylucene-7.7.1.rar

    在实际使用中,开发者需要下载解压"pylucene-7.7.1.rar",然后按照官方文档的指示进行安装和配置。在Python环境中导入PyLucene模块,便可以开始构建自己的文本搜索系统。通过实践和学习,开发者可以掌握如何利用...

    Linux在Python3.6下安装PyLucene-8.1.1

    Pylucene: Pylucene-8.1.1 1. 下载Pylucene-8.1.1并解压 地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/pylucene/#targz 解压: tar xzvf pylucene-8.1.1-src.tar.gz 2. 安装 openjdk sudo apt-get ...

    ubuntu下安装solr4.9详细介绍

    文档中详细介绍了如何在ubuntu下面安装solr-4.9.0,以及在安装过程中出现的问题和解决办法

    搜索引擎Luecne技术--助教PPT

    - **分块索引提升性能**:Lucene支持分块索引,可以快速建立新文件的索引,随后再与其他已有的索引合并,从而提高索引构建的速度。 - **灵活的文本分析接口**:通过提供一个灵活的文本分析接口,Lucene允许用户...

    Lucene 索引、删除、检索 实例

    **Lucene 索引、删除、检索 实例** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了一个简单的API,使得开发者可以方便地在应用程序中集成高级的搜索功能。本实例将详细介绍如何使用Lucene...

    用python做一个搜索引擎(Pylucene)的实例代码

    创建一个简单的Flask应用,接收用户输入的搜索请求,通过Pylucene查询索引,然后返回搜索结果。 总结:通过Python结合Pylucene和Flask,可以构建一个简单的搜索引擎,实现信息的抓取、处理和搜索。Pylucene提供了...

    Lucene in Action

    ### Lucene in Action #### 知识点概览 1. **Lucene 的定义与功能** ...通过上述内容的学习,读者将能够深入了解 Lucene 的基本概念、核心技术和实际应用案例,从而更好地利用 Lucene 来解决实际搜索问题。

    lucene-4.0.0完整包

    - **搜索服务**: 通过查询解析器,Lucene 支持多种查询语法,用户可以构造复杂的布尔查询、短语查询、模糊查询等,以满足不同搜索需求。 - **高亮显示**: Lucene 还提供了搜索结果高亮的功能,可以在搜索结果中突出...

    lupyne:基于PyLucene的Pythonic搜索引擎

    Lupyne是基于PyLucene的搜索引擎, 是用于访问Java Lucene的Python扩展。 Lucene是一个相对较低级别的工具包,PyLucene通过自动代码生成对其进行包装。 因此,尽管在可能的情况下将Java习惯用语翻译成Python习惯用语...

    Lucene In Action

    - **过滤器**:在索引阶段或查询阶段添加过滤器来优化结果集。 **知识点五:Lucene 在实际项目中的应用** - **文档格式解析**: - 使用第三方库如 Apache Tika 或 PDFBox 来解析 PDF、Word 等常用文档格式,并...

    Lucene(搜索引擎)开发包

    - **IndexReader**:读取索引,提供对索引的访问和查询。 - **IndexSearcher**:执行搜索操作,根据查询返回匹配的文档。 - **QueryParser**:解析用户的查询字符串,生成相应的 Query 对象。 3. **文件列表解析...

    基于lucene的python版中文纠错研究+源代码+文档说明

    ####近来发现语言识别过程中会有很多是有偏差了的,经常查询发现lucene可以实现纠错功能,前提是需要大量的文本,后来发现有pylucene就想到了用这个 #开发语言 * python #python依赖包 * PyLucene * jcc #如何使用...

    Reddit内容搜索引擎.zip

    它利用PRAW进行数据采集,PyLucene建立索引,Flask构建web界面。项目分为数据爬取、建立索引和检索三个阶段。首先,通过PRAW从Reddit子版块中爬取数据;然后,利用PyLucene建立索引,允许创建自定义分析器处理特定的...

    lucene基本包

    Lucene提供了丰富的Java API,开发人员可以通过简单的代码调用来实现索引创建、更新、查询等功能。同时,Lucene还提供了对其他语言的支持,如Python的PyLucene,JavaScript的js-lucene等。 10. **应用场景** ...

    Python_检索和检索增强llm.zip

    这通常包括利用机器学习和深度学习模型来理解查询和文档的语义,从而提供更准确的匹配。例如,预训练的语言模型如BERT、RoBERTa和T5等,可以用于生成查询的向量化表示,以提高检索的精确度。 在"FlagEmbedding_...

    Lucene 全文检索

    1. **Lucene的基本概念**:介绍了Lucene的核心组件,如文档(Document)、字段(Field)、索引(Index)和查询(Query)。 2. **索引过程**:详细解析了如何使用Lucene对文本进行分词、建立倒排索引的过程,以及...

Global site tag (gtag.js) - Google Analytics