仅仅为了学习我已经从1个文件创建了一个索引并想要搜索它。我使用的是Lucene 4.4版本。我知道索引部分是真的。
tempFileName是包含标记的文件名,此文件包含以下字词:
“奇加奇甚至是##偶加甚至是偶数##奇加甚至是奇数##”
但是,当我提供查询时,它什么都不返回。我看不出会出现什么问题。非常感谢任何帮助。
索引部分:
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();
}
答案 0 :(得分:2)
问题是您使用的是StringField
。 StringField将整个输入索引为单个标记。适用于原子字符串,如关键字,标识符,类似的东西。不适合全文搜索。
使用TextField
。
答案 1 :(得分:0)
StringField有一个令牌。所以,我尝试用简单的代码进行测试。
例如@ yns~如果你有一个文件,这是cralwer文件,这个内容有一个字符串。
ex)文件名:data03.scd,内容:parktaeha
您尝试使用&#34; parktaeha&#34;的queryString。
你得到了搜索结果! 字段名称:acet,queryString parktaeha
========开始搜索!! ========== q = acet:parktaeha找到1个匹配。结果数组长度:1搜索结果=&gt; 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));
}