繁体   English   中英

如何开始使用Apache Lucene搜索bean属性?

[英]How to get started on searching through bean properties with Apache Lucene?

我正在尝试使用JPA的Java EE框架的全文本搜索引擎框架,并且不想切换到提供相当整洁的Hibernate Search功能的Hibernate,所以现在从Apache Lucene开始。

我想搜索JPA实体的String字段(为它们创建索引后,即作家/读者示例)。 我将使用包装持久层的EJB来使索引保持最新。 我认为使用JPA和Java EE无关紧要。

由于Apache项目没有政策来保持其文档的最新状态,或者至少将它们标记为过时的大多数示例, 访问https://wiki.apache.org/lucene-java/TheBasics,而类似网站则没有之所以无法使用,是因为类和方法已被删除。 通过搜索引擎找到的博客帖子也是如此。 可以找到它们,但是任何发现的东西都必须尝试一下,因为大约有 90%的变化是,人们发现示例引用了不再存在的类或方法...

我正在寻找显示上述用例以及Lucene的最新版本(即6.5.0 afaik)的任何示例。

我不确定6.5中的所有更改,但是下面是Lucene 6.0.0的代码,也可以使用6.5.0编译/运行。

IndexCreation

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.core.SimpleAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.FSDirectory;

public class IndexCreator {

    public static IndexWriter getWriter() throws IOException{
          File indexDir = new File("D:\\Experiment");
          SimpleAnalyzer analyzer = new SimpleAnalyzer();
          IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
          indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
          IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir
                .toPath()), indexWriterConfig);
          indexWriter.commit();
          return indexWriter;

    }
}

现在,您可以使用writer来使用writer.updateDocument(...) writer.addDocument(...)方法对文档建立索引。

可以将字段添加到文档中,如下所示,

doc.add(new Field("NAME", "Tom", new FieldType(TextField.TYPE_STORED)));

搜索

import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.store.FSDirectory;



public class LuceneSearcher {

    public static void searchIndex() throws IOException{

        IndexReader reader = DirectoryReader.open(FSDirectory.open(Paths.get("D:\\Experiment")));

        IndexSearcher searcher = new IndexSearcher(reader);

        TopDocs hits = searcher.search(new WildcardQuery(new Term("NAME", "*")), 20);

        if (null == hits.scoreDocs || hits.scoreDocs.length <= 0) {
            System.out.println("No Hits1 Found");
            return;
        }

        System.out.println(hits.scoreDocs.length + " hits1 Docs found !!");

        for (ScoreDoc hit : hits.scoreDocs) {
            Document doc = searcher.doc(hit.doc);
        }

        reader.close();
    }
}

搜索器代码假定您有一个带有NAME作为字段名称的索引文档。

我认为,这应该足以让您入门。

需要帮助请叫我。

我有这些行家依赖

<dependencies>

    <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-core</artifactId>
            <version>6.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-analyzers-common</artifactId>
            <version>6.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.lucene</groupId>
            <artifactId>lucene-queryparser</artifactId>
            <version>6.5.0</version>
        </dependency>
  </dependencies>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM