如何开始使用 Apache Lucene 搜索 bean 属性?
How to get started on searching through bean properties with Apache Lucene?
我正在尝试使用 JPA 的 Java EE 框架的全文搜索引擎框架,不想切换到提供非常简洁的 Hibernate 搜索功能的 Hibernate,所以我从Apache Lucene,现在。
我想搜索 JPA 实体的字符串字段(在为它们创建索引后,即 writer/reader 示例)。我将使用一个包含持久层的 EJB 来使索引保持最新。我认为我使用 JPA 和 Java EE 是无关紧要的。
因为 Apache 项目根本没有政策来保持他们的文档是最新的,或者至少将它们标记为过时 https://wiki.apache.org/lucene-java/TheBasics 和类似站点中的大多数示例都无法使用,因为类 已经删除了方法。通过搜索引擎找到的博客文章也是如此。找到它们是可能的,但任何发现的东西都需要尝试,因为有 ca。 90% 的变化表明该示例引用了 类 或不再存在的方法...
我正在寻找任何显示上述用例的示例以及最新版本的 Lucene,即 6.5.0 afaik。
我不确定 6.5 中发生了什么变化,但下面是 Lucene 6.0.0 的代码以及使用 6.5.0 编译 / 运行 的代码。
索引创建
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.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
作为字段名称的索引文档。
我认为,这应该足以让您入门。
如果您还需要什么,请告诉我。
我有这些 Maven 依赖项,
<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>
我正在尝试使用 JPA 的 Java EE 框架的全文搜索引擎框架,不想切换到提供非常简洁的 Hibernate 搜索功能的 Hibernate,所以我从Apache Lucene,现在。
我想搜索 JPA 实体的字符串字段(在为它们创建索引后,即 writer/reader 示例)。我将使用一个包含持久层的 EJB 来使索引保持最新。我认为我使用 JPA 和 Java EE 是无关紧要的。
因为 Apache 项目根本没有政策来保持他们的文档是最新的,或者至少将它们标记为过时 https://wiki.apache.org/lucene-java/TheBasics 和类似站点中的大多数示例都无法使用,因为类 已经删除了方法。通过搜索引擎找到的博客文章也是如此。找到它们是可能的,但任何发现的东西都需要尝试,因为有 ca。 90% 的变化表明该示例引用了 类 或不再存在的方法...
我正在寻找任何显示上述用例的示例以及最新版本的 Lucene,即 6.5.0 afaik。
我不确定 6.5 中发生了什么变化,但下面是 Lucene 6.0.0 的代码以及使用 6.5.0 编译 / 运行 的代码。
索引创建
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.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
作为字段名称的索引文档。
我认为,这应该足以让您入门。
如果您还需要什么,请告诉我。
我有这些 Maven 依赖项,
<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>