【问题标题】:Lucene Query does not return results even though it shouldLucene Query 不返回结果,即使它应该
【发布时间】:2013-01-18 17:37:44
【问题描述】:

我目前正在尝试从 RamDirectory 中的 Lucene 索引 (v. 4) 获取所有文档。

在创建索引时使用以下 addDocument 函数:

public void addDocument(int id, String[] values, String[] fields) throws IOException{
    Document doc = new Document();

    doc.add(new IntField("getAll", 1, IntField.TYPE_STORED));    
    doc.add(new IntField("ID", id, IntField.TYPE_STORED));                                              
    for(int i = 0; i < fields.length; i++){
        doc.add(new TextField(fields[i], values[i], Field.Store.NO));
    }

    writer.addDocument(doc);
}

在为所有文档调用此方法后,编写器已关闭。 正如您从添加到文档的第一个字段中看到的那样,我添加了一个附加字段“getAll”以方便检索所有文档。如果我理解正确,查询“getAll:1”应该返回索引中的所有文档。但事实并非如此。 为此,我正在使用以下功能:

public List<Integer> getDocIds(int noOfDocs) throws IOException, ParseException{
    List<Integer>   result    = new ArrayList<Integer>(noOfDocs);
    Query           query     = parser.parse("getAll:1");
    ScoreDoc[]      docs      = searcher.search(query, noOfDocs).scoreDocs;

    for(ScoreDoc doc : docs){
        result.add(doc.doc);
    }

    return result;
}

noOfDocs 是被索引的文档数。当然,我在创建 IndexSearcher 时使用了相同的 RamDirectory。 将已解析的查询替换为手动创建的 TermQuery 也无济于事。 该查询不返回任何结果。

希望有人可以帮助找出我的错误。 谢谢

【问题讨论】:

    标签: lucene


    【解决方案1】:

    我相信您在搜索时遇到了麻烦,因为您使用的是 IntField,而不是 StringField 或 TextField。 IntField 和其他数字字段是为数字范围查询而设计的,并且不以其原始形式编制索引。您可以使用NumericRangeQuery 来搜索它们。

    实际上,在我看来,IntField 应该只用于数值,而不是用于一串数字,这就是你所拥有的。 ID 通常应该是关键字或文本字段。

    就拉取所有记录而言,您无需添加字段即可。只需使用MatchAllDocsQuery

    【讨论】:

    • MatchAllQuery 让它工作! - 也感谢有关 Int -Field 的信息,我会改变它
    【解决方案2】:

    我认为首先你应该运行Luke 来验证索引的内容。

    此外,如果您允许 * 作为带有 queryParser.setAllowLeadingWildcard(true); 的查询的第一个字符,那么像 ID:* 这样的查询将检索所有文档,而不必包含 getAll强>领域。

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多