words = Parser.extractText(doc.split("\\s+")); for (String word : words) {
newDoc.add(new TextField("content", word, Field.Store.YES));
}
IndexWriter writer = new IndexWriter(index, analyzer);
writer.addDocument(newDoc);
writer.close();
}
}
}
```
4. 查询模块
实现简单查询功能:
```java
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import java.io.IOException;
import java.util.List;
public class Searcher {
private Directory index;
private StandardAnalyzer analyzer;
public Searcher() throws IOException {
index = DirectoryBuilder.create().open("index");
analyzer = new StandardAnalyzer();
}
public List search(String queryStr) throws IOException { QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse(queryStr);
IndexSearcher searcher = new IndexSearcher(index);
TopDocs results = searcher.search(query, 10);
return results.scoreDocs.stream()
.map(scoreDoc -> searcher.doc(scoreDoc.doc))
.collect(Collectors.toList());
}
}
```
三、整合与优化
分词优化:
使用`ansj`等工具进行中文分词。引擎用
缓存机制:
实现查询结果缓存(如使用`LRUCache`)。搜索索引
分布式架构:
考虑使用Elasticsearch进行分布式搜索。引擎用
四、搜索索引示例运行
```java
public class SearchEngineApp {
public static void main(String[] args) throws IOException {
Crawler crawler = new Crawler();
Document doc = crawler.crawl("http://example.com");
List texts = Parser.extractText(doc); Indexer indexer = new Indexer();
indexer.indexDocuments(texts);
Searcher searcher = new Searcher();
List results = searcher.search("Java"); for (Document d : results) {
System.out.println(d.get("name"));
}
}
}
```
总结
以上是一个简单的Java搜索引擎实现框架,包含爬取、解析、索引和查询四个核心模块。实际应用中可根据需求扩展功能,如支持多语言分词、实时索引更新、分布式搜索等。