【问题标题】:I want read the single term in my index with Lucene我想用 Lucene 阅读索引中的单个术语
【发布时间】:2011-01-14 13:26:33
【问题描述】:

我想阅读每一个索引。我想阅读并打印以控制索引中的单个术语。 (我不想和卢克一起看内容)。我必须使用类IndexReader吗?

有人可以帮我吗?

我尝试过:

    iReader = IndexReader.open(directory);

    int num = iReader.numDocs();
    for ( int i = 0; i < num; i++)
    {
        if ( ! iReader.isDeleted( i))
        {
            org.apache.lucene.document.Document d = iReader.document(i);
            System.out.println( "d=" +d.getField("title").tokenStreamValue());

        }
    }


    org.apache.lucene.document.Document doc = new org.apache.lucene.document.Document();

    //aggiungo tutti i documenti


    Field title = new Field(
              "title",
              testDoc.title,
              Field.Store.YES,
              Field.Index.ANALYZED,
              Field.TermVector.WITH_POSITIONS_OFFSETS);

    doc.add(title);


    Field content = new Field(
              "content",
              testDoc.content,
              Field.Store.YES,
              Field.Index.ANALYZED,
              Field.TermVector.WITH_POSITIONS_OFFSETS);
    doc.add(content);


    iWriter.addDocument(doc);

但是d = null; 我哪里做错了? 我想将术语检索到我索引的字段标题...

非常感谢。

【问题讨论】:

    标签: java lucene indexing


    【解决方案1】:

    同样,我使用Java,但原理是一样的。

    您想要做的类似于枚举词频,但您只关心不同的字段。

    这个example 和这个example 关于如何计算 Lucene 索引中的词频应该会让你继续前进。

    【讨论】:

    • 谢谢乔尔,但我只想检索索引中的术语...我不在乎的术语频率...
    • @user568720:代码将回答您的问题。看看就好。
    【解决方案2】:

    我使用的是 Lucene.Net,但我认为逻辑是相同的。

    StringValue()、ReaderValue() 和 BinaryValue() 必须是其中之一。那些未使用的要么返回 null,要么抛出异常。在您的情况下,请尝试改为阅读 StringValue()。

    【讨论】:

    • Simon,如果我使用 StringValue(),将返回 doc.title 的值。我想要令牌...
    • 只需通过您的分析器传递文档标题,您将获得生成的令牌。
    • 另一种解决方案是使用 IndexReader.GetTermFreqVector(documentId, fieldName),但这需要您使用 TermVector.YES 为您的字段编制索引。
    • 我不明白。我在哪里做这个手术?我应该使用什么?感谢您的耐心等待
    • 查看 Joel 的回答,他已经提供了一些链接来帮助您入门。
    【解决方案3】:

    要检查索引,请使用IndexReader。该类有一个方法document(int),您可以使用它来查找索引包含的各个文档。然后,该文档会为您提供为该文档创建的所有字段。

    使用该字段,您可以获取它的值或标记流(即索引中结束的字符串)。

    [编辑] 如果删除文档,索引会有漏洞。所以你必须添加一个检查:

    org.apache.lucene.document.Document d = iReader.document(i);
    if( d == null ) continue; // <<-- You need this check
    
    System.out.println( "d=" +d.getField("title").tokenStreamValue());
    

    【讨论】:

    • 我亚伦感谢您的回复。我修改了我上面的帖子。哪里错了??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多