首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Lucene IndexReader读取4.4版的索引?

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

Stack Overflow用户
提问于 2013-09-18 01:44:02
回答 2查看 2.9K关注 0票数 0

为了学习,我从1个文件创建了一个索引,并希望搜索它。我正在使用Lucene版本4.4。我知道索引部分是真的。

tempFileName是包含令牌的文件名,该文件包含以下单词:

奇+奇数是偶数##偶数+偶数是偶数##奇加偶数是奇数##

但是,当我提供一个查询时,它什么也不返回。我看不出会有什么问题。任何帮助都是非常感谢的。

索引部分:

代码语言:javascript
复制
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);
    }

搜索部分:

代码语言:javascript
复制
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();

    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-18 15:59:53

问题是您使用的是StringField。StringField将整个输入作为单个令牌进行索引。很适合原子字符串,比如关键字,标识符,诸如此类的东西。不适合全文搜索。

使用TextField

票数 2
EN

Stack Overflow用户

发布于 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!!==========

看下面的代码。这个代码是测试代码。

代码语言:javascript
复制
    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));
    }

参考文献

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18862600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档