学习lucene建立检索和搜索过程中遇到的错误

使用lucene4.6.0版本建立的索引和搜索,在创建索引后会产生如下索引文件
[img]
[img]http://dl2.iteye.com/upload/attachment/0096/4453/79ed3575-bec1-3dbf-bb93-067fe57531b5.png[/img]
[/img]

但是在搜索时[code="java"]
ScoreDoc[] sds = tds.scoreDocs;
[/code]中的sds总为空。[b]求大神帮忙解决!!!!!!![/b]

代码如下:

[code="java"]
package nhky.bs.lucene.test.hellolucene;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.ParseException;
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 org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;

public class HelloLucene {

/**
 * 建立索引
 */
public void index() {

    IndexWriter writer = null;
    try {
        Directory directory = FSDirectory.open(new File("F:/lucene/index01"));
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_46,new StandardAnalyzer(Version.LUCENE_46));
        writer = new IndexWriter(directory, iwc);

        // 3,创建Document
        Document document = null;
        // 4,为Docuemnt添加Field
        File files = new File("F:/lucene/files");
        // 5,通过IndexWriter添加文档到索引中
        for (File file : files.listFiles()) {
            document = new Document();
             document.add(new Field("content", new FileReader(file),new FieldType()));
             document.add(new StoredField("fileName", file.getName()));
             document.add(new StoredField("path", file.getAbsolutePath()));  
             writer.addDocument(document);
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

/**
 * 建立搜索
 */
public void searcher() {
    DirectoryReader reader = null;
    try {
        // 创建Directory (去哪里搜索,此目录跟建立索引的目录一致)
        Directory directory = FSDirectory.open(new File("F:/lucene/index01"));
        reader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(reader);     
        QueryParser parser = new QueryParser(Version.LUCENE_46, "fileName",new StandardAnalyzer(Version.LUCENE_46));
        Query query = parser.parse("document");

        //根据searcher搜索并且返回TopDocs
        TopDocs tds = searcher.search(query, 10);

        // 根据TopDocs获取ScoreDoc对象
        // 得到查询结果数组
        ScoreDoc[] sds = tds.scoreDocs; 
        for (ScoreDoc sd : sds) {
            // 根据searcher和scoreDoc对象获取具体的Document对象
            Document d = searcher.doc(sd.doc);
            // 根据Document获取需要的值
            System.out.println("搜索结果:");
            System.out.println(d.get("fileName") + "[" + d.get("path")
                    + "]");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    } finally {
        // 关闭reader
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

}

[/code]

2个回答

Query query = parser.parse("document.txt"); 用全名称来搜,或者Query query = parser.parse("document*"); 因为StoreField是不进行分词的。

Mr_WangB
mr_wangb 您好,刚测试了一下,把文件名写完整是可以的检索到的,谢谢。 另外还有一个问题,我这里分别建立了content、filename、path三个检索,目的是想建立内容、文件名、路径的检索。可是在搜索时根据路径和内容还是搜不到。我的做法是:将76行的filename换成content或者path,第77行的document.txt换成路径(如:F:/lucene/files)或者某个文件中的某个单词(如:document),可还是没有显示出搜索结果。 恳求您指出我的错误之处,非常感谢。
接近 6 年之前 回复

请问您建立索引的文档中有文件名为document的吗?
注意document为一个整体。
第77行

Query query = parser.parse("document");

中document为您搜索的关键字。

Mr_WangB
mr_wangb 谢谢您的解答,让我也学习了。 我估计是document.add(...)里面的field的问题,或者是查询方法的问题。我是初学,对这些类或者方法不是很清楚,也不知道该适合用那些.刚试了50行后面添加也没有效果。 比如问题是这样的:对三个文件,建立内容、文件名、路径的检索如何建立,然后如何查询?
接近 6 年之前 回复
gy090028
gy090028 我之前用的4.5的,我是结构化之后的代码,没有集中把document,query等写在一起的代码。 我看了一下,基本上和你的差不多,不过我用的 IKAnalyzer,还有没次添加document都有 writer.forceMerge(1);要不你在50行后面添加这句话试试
接近 6 年之前 回复
Mr_WangB
mr_wangb 有的,我有三个文件,分别是document.txt、field.txt、indexfile.txt,我估计是检索或者搜索的代码或者是哪些方法用错了...不是很了解,我用的4.6版本的,不知道是不是跟之前的版本区别很大? 看到其他版本建立的检索文件有好多,而这里只有3个?难道我检索建立失败了?希望您能给些建议,或者您有没有写过类似的代码,给我参考一下QQ2843169060@qq.com?谢谢。
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问