如何在 Java Lucene 6.2.0 中创建索引和搜索查询

How to creat index and search query in Java Lucene 6.2.0

我想使用 Lucene 版本 6.2.0,我在 java 中创建了两个函数是 creatIndex 和 searchIndex 但它没有 运行。我不明白如何将 Field 用于 Documents 方法的参数。

public void searchIndex(String sentence) throws IOException
{
    File dir = new File(INDEX_DIRECTORY);
    Path path = dir.toPath();
    Directory directory = FSDirectory.open(path);
    DirectoryReader ireader=DirectoryReader.open(directory);
    IndexSearcher isearcher=new IndexSearcher(ireader);
    PhraseQuery.Builder builder = new PhraseQuery.Builder(); 
    String[] words = sentence.split(" ");
    for (String word : words) {
        builder.add(new Term("contents", word));
    }
    PhraseQuery pq = builder.build();
    TopDocs topDocs = isearcher.search(pq, 10);
    for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
        Document doc = isearcher.doc(scoreDoc.doc);
        System.out.println(doc);
    }
}

我遇到了三个问题:

  1. 您的 creatDocumentsFiles 参数处在查找要索引的文件的同一位置打开索引。然后,您的 searchIndex 方法正在寻找 INDEX_DIRECTORY 处的索引。我想您的 creatDocuments 也应该在 INDEX_DIRECTORY 上开设一个作家。喜欢

    FSDirectory luceneDirectory = FSDirectory.open(new File(INDEX_DIRECTORY).toPath());
    IndexWriterConfig conf = new IndexWriterConfig();
    try (IndexWriter indexWriter = new IndexWriter(directory, conf)) {
        for (File file : new File(Files).listFiles()) {
        ...
    
  2. 您的 FieldType 将无法使用。您至少需要 指定它是索引的还是存储的。我建议您不要从自定义字段类型开始。只需使用具有预定义字段类型的 Field 实现,例如 TextField(请参阅 Field documentation 中的 "Direct Known Subclasses" 列表)。

        Field contentField = new TextField(LuceneConstants.CONTENTS, reader);
        Field fileNameField = new TextField(LuceneConstants.FILE_NAME, file.getName(), Field.Store.YES);
        Field filePathField = new TextField(LuceneConstants.FILE_PATH, file.getCanonicalPath(), Field.Store.NO);
    
  3. 您正在重复使用相同的 Document,而不是为每个文件创建一个新文件。您应该为 for 循环的每次迭代构建一个新的 Document