如何使用Lucene IndexReader读取版本4.4中的索引?

如何使用Lucene IndexReader读取版本4.4中的索引?,lucene,information-retrieval,analyzer,Lucene,Information Retrieval,Analyzer,为了便于学习,我从1个文件创建了一个索引,并希望搜索它。我使用的是Lucene版本4.4。我知道索引部分是正确的 tempFileName是包含令牌的文件名,该文件包含以下文字: “奇数加奇数等于偶数##偶数加偶数等于偶数##奇数加偶数等于奇数#” 但是,当我提供一个查询时,它什么也不返回。我看不出会有什么问题。非常感谢您的帮助 索引部分: public void startIndexingDocument(String indexPath) throws IOException {

为了便于学习,我从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();

    }
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。