0

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

    }
4

2 回答 2

2

问题是您使用的是StringField. StringField 将整个输入索引为单个标记。适用于原子字符串,如关键字、标识符等。不适合全文搜索。

使用TextField.

于 2013-09-18T15:59:53.597 回答
0

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));
    }

参考网址

于 2014-06-16T06:33:02.020 回答