为了学习,我从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();
}发布于 2013-09-18 15:59:53
问题是您使用的是StringField。StringField将整个输入作为单个令牌进行索引。很适合原子字符串,比如关键字,标识符,诸如此类的东西。不适合全文搜索。
使用TextField。
发布于 2014-06-16 06:33:02
StringField只有一个令牌。所以,我试着用简单的代码进行测试。
例如,@yns~如果您有一个文件,这是cralwer文件,并且这个内容只有一个字符串。
文件名: data03.scd,目录: parktaeha
您尝试使用"parktaeha“queryString搜索。
你得到搜索结果了!字段名: queryString parktaeha
========开始搜索!!========== q=acet:parktaeha找到1次点击。结果数组长度:1搜索result=> parktaeha ======== end search!!==========
看下面的代码。这个代码是测试代码。
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));
}https://stackoverflow.com/questions/18862600
复制相似问题