Как можно извлечь определенное поле из всех проиндексированных документов, используя PyLucene? - PullRequest
0 голосов
/ 06 февраля 2019

В Java это можно сделать с помощью «MatchAllDocsQuery ()», но для Pylucene нет документации, в которой упоминается, как это можно сделать.

Это код Python для публикации отдельных запросов, а затем для извлечения всехполя из найденных документов.

INDEX_DIR = "directory/where/the/document/index/is/stored"

import sys, os, lucene

from java.nio.file import Paths
from org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.index import DirectoryReader
from org.apache.lucene.queryparser.classic import QueryParser
from org.apache.lucene.store import SimpleFSDirectory
from org.apache.lucene.search import IndexSearcher

def run(searcher, analyzer):
    while True:
        print
        print("Hit enter with no input to quit.")
        command = input("Query:")
        if command == '':
            return

        print
        print("Searching for:", command)
        query = QueryParser("contents", analyzer).parse(command)
        #query = "MatchAllDocsQuery()"
        scoreDocs = searcher.search(query, 50).scoreDocs
        print("%s total matching documents." % len(scoreDocs))

        for scoreDoc in scoreDocs:
            doc = searcher.doc(scoreDoc.doc)
            table = dict((field.name(), field.stringValue()) for field in doc.getFields())
            print(table['doi'])
            #print('path:', doc.get("path"), 'name:', doc.get("name"), 'title:', doc.get("text"))


if __name__ == '__main__':
    lucene.initVM()
    print('lucene', lucene.VERSION)
    base_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    directory = SimpleFSDirectory.open(Paths.get(INDEX_DIR))
    print("Directory name is given below")
    print(directory)

    searcher = IndexSearcher(DirectoryReader.open(directory))
    print(searcher)
    analyzer = StandardAnalyzer()

    # Calling the run function for execution
    run(searcher, analyzer)
    del searcher

1 Ответ

0 голосов
/ 07 февраля 2019

Незначительное изменение в запросе может заставить Lucene получить все проиндексированные документы.Это просто заменить переменную команды на (command = ".✱.")..✱.ищет все поля и значения полей во всех документах (используя звездочку).

INDEX_DIR = "directory/where/the/document/index/is/stored"

import sys, os, lucene

from java.nio.file import Paths
from org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.index import DirectoryReader
from org.apache.lucene.queryparser.classic import QueryParser
from org.apache.lucene.store import SimpleFSDirectory
from org.apache.lucene.search import IndexSearcher

def run(searcher, analyzer):
    command = ".*."
    print("Searching for:", command)
    query = QueryParser("contents", analyzer).parse(command)
    #query = "MatchAllDocsQuery()"
    scoreDocs = searcher.search(query, 50).scoreDocs
    print("%s total matching documents." % len(scoreDocs))

    for scoreDoc in scoreDocs:
        doc = searcher.doc(scoreDoc.doc)
        table = dict((field.name(), field.stringValue()) for field in doc.getFields())
        print(table['doi'])
            #print('path:', doc.get("path"), 'name:', doc.get("name"), 'title:', doc.get("text"))


if __name__ == '__main__':
    lucene.initVM()
    print('lucene', lucene.VERSION)
    base_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    directory = SimpleFSDirectory.open(Paths.get(INDEX_DIR))
    print("Directory name is given below")
    print(directory)

    searcher = IndexSearcher(DirectoryReader.open(directory))
    print(searcher)
    analyzer = StandardAnalyzer()

    # Calling the run function for execution
    run(searcher, analyzer)
    del searcher
...