如何使用Lucene IndexReader读取版本4.4中的索引?
为了便于学习,我从1个文件创建了一个索引,并希望搜索它。我使用的是Lucene版本4.4。我知道索引部分是正确的 tempFileName是包含令牌的文件名,该文件包含以下文字: “奇数加奇数等于偶数##偶数加偶数等于偶数##奇数加偶数等于奇数#” 但是,当我提供一个查询时,它什么也不返回。我看不出会有什么问题。非常感谢您的帮助 索引部分:如何使用Lucene IndexReader读取版本4.4中的索引?,lucene,information-retrieval,analyzer,Lucene,Information Retrieval,Analyzer,为了便于学习,我从1个文件创建了一个索引,并希望搜索它。我使用的是Lucene版本4.4。我知道索引部分是正确的 tempFileName是包含令牌的文件名,该文件包含以下文字: “奇数加奇数等于偶数##偶数加偶数等于偶数##奇数加偶数等于奇数#” 但是,当我提供一个查询时,它什么也不返回。我看不出会有什么问题。非常感谢您的帮助 索引部分: public void startIndexingDocument(String indexPath) throws IOException {
public void startIndexingDocument(String indexPath) throws IOException {
Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_44);
SimpleFSDirectory directory = new SimpleFSDirectory(new File(indexPath));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44,
analyzer);
IndexWriter writer = new IndexWriter(directory, config);
indexDocs(writer);
writer.close();
}
private void indexDocs(IndexWriter w) throws IOException {
Document doc = new Document();
File file = new File(tempFileName);
BufferedReader br = new BufferedReader(new FileReader(tempFileName));
Field field = new StringField(fieldName, br.readLine().toString(),
Field.Store.YES);
doc.add(field);
w.addDocument(doc);
}
搜索部分:
public void readFromIndex(String indexPath) throws IOException,
ParseException {
Analyzer anal = new WhitespaceAnalyzer(Version.LUCENE_44);
QueryParser parser = new QueryParser(Version.LUCENE_44, fieldName, anal);
Query query = parser.parse("odd");
IndexReader reader = IndexReader.open(NIOFSDirectory.open(new File(
indexPath)));
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
// display
System.out.println("fieldName =" + fieldName);
System.out.println("Found : " + hits.length + " hits.");
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
System.out.println((i + 1) + ". " + d.get(fieldName));
}
reader.close();
}
public void readFromIndex(String indexPath)引发IOException,
语法异常{
Analyzer anal=新的空白分析器(版本.LUCENE_44);
QueryParser parser=新的QueryParser(Version.LUCENE_44,fieldName,anal);
Query=parser.parse(“奇”);
IndexReader=IndexReader.open(NIOFSDirectory.open)(新文件(
指数),;
IndexSearcher search=新的IndexSearcher(阅读器);
TopScoreDocCollector=TopScoreDocCollector.create(10,true);
searcher.search(查询、收集器);
ScoreDoc[]hits=collector.topDocs().scoreDocs;
//展示
System.out.println(“fieldName=“+fieldName”);
System.out.println(“找到:“+hits.length+”hits.”);
for(int i=0;i
问题在于您使用的是StringField
。StringField将整个输入作为单个标记进行索引。适用于原子字符串,如关键字、标识符等。不适合全文搜索
使用。StringField并使用单个令牌。所以,我尝试用简单的代码进行测试 例如@yns~如果您有一个文件,该文件是cralwer文件,并且其内容只有一个字符串 ex)文件名:data03.scd,内容:parktaeha 您尝试使用“parktaeha”查询字符串进行搜索 你得到了搜索结果! 字段名称:acet,queryString parktaeha =========开始搜索!!==================q=acet:parktaeha找到1个命中率。结果数组长度:1搜索结果=>parktaeha ==========结束搜索========== 看下面的代码。此代码是测试代码
while((target = in.readLine()) != null){
System.out.println("target:"+target);
doc.add(new TextField("acet",target ,Field.Store.YES)); // use TextField
// TEST : doc.add(new StringField("acet", target.toString(),Field.Store.YES));
}
非常感谢@femtoRgon。