如何在 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);
}
}
我遇到了三个问题:
您的 creatDocuments
在 Files
参数处在查找要索引的文件的同一位置打开索引。然后,您的 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()) {
...
您的 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);
您正在重复使用相同的 Document
,而不是为每个文件创建一个新文件。您应该为 for 循环的每次迭代构建一个新的 Document
。
我想使用 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);
}
}
我遇到了三个问题:
您的
creatDocuments
在Files
参数处在查找要索引的文件的同一位置打开索引。然后,您的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()) { ...
您的
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);
您正在重复使用相同的
Document
,而不是为每个文件创建一个新文件。您应该为 for 循环的每次迭代构建一个新的Document
。