java - 如何在 Lucene 4 中搜索 int 字段?

标签 java lucene

我正在尝试实现文档索引(大致对应于数据库行),其中一个字段是整数。我将它们添加到索引中,例如:

Document doc = new Document();
doc.add(new StringField("ticket_number", rs.getString("ticket_number"),
        Field.Store.YES));
doc.add(new IntField("ticket_id", rs.getInt("ticket_id"),
        Field.Store.YES));
doc.add(new StringField("id_s", rs.getString("ticket_id"),
        Field.Store.YES));
w.addDocument(doc);

似乎我根本无法查询 ticket_id 字段,而 id_s 工作得很好。

其中一个文档是(为了便于阅读,我添加了空格):

Document<
    stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<ticket_number:230114W> 
    stored<ticket_id:152> 
    stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<id_s:152>>

所以我的 int 字段被存储,但没有被索引。此查询按预期工作:id_s:152,而此查询从不返回任何内容:ticket_id:152

我做错了什么?如何将这样的字段添加到索引中并使其可搜索?

最佳答案

以下对我有用:

    RAMDirectory idx = new RAMDirectory();
    IndexWriter writer = new IndexWriter(
            idx,
            new IndexWriterConfig(Version.LUCENE_40, new ClassicAnalyzer(Version.LUCENE_40))
    );
    Document document = new Document();
    document.add(new StringField("ticket_number", "t123", Field.Store.YES));
    document.add(new IntField("ticket_id", 234, Field.Store.YES));
    document.add(new StringField("id_s", "234", Field.Store.YES));
    writer.addDocument(document);
    writer.commit();

    IndexReader reader = DirectoryReader.open(idx);
    IndexSearcher searcher = new IndexSearcher(reader);

    Query q1 = new TermQuery(new Term("id_s", "234"));
    TopDocs td1 = searcher.search(q1, 1);
    System.out.println(td1.totalHits);  // prints "1"

    Query q2 = NumericRangeQuery.newIntRange("ticket_id", 1, 234, 234, true, true);
    TopDocs td2 = searcher.search(q2, 1);
    System.out.println(td2.totalHits);  // prints "1"

正如 femtoRgon 指出的那样,对于数值(长整数、日期、 float 等),您需要有 NumericRangeQuery 并指定精度。否则 Lucene 不知道你想如何定义相似性。

关于java - 如何在 Lucene 4 中搜索 int 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14074613/

相关文章:

java - 如何正确地进行依赖注入(inject)(在 Spring 中)?

java - Apache Lucene QueryParser.parse 未在 FuzzyQuery 上使用分析器

java - 如何使用 lucene 索引查询国家代码?

php - 如何知道 Solr 搜索在 Magento CE 中的工作原理

java - 检索每个文档 Neo4j Lucene 的分数,而不仅仅是顺序

java - 在 Lucene 4.4.0 中搜索词干和精确词

java - 如何使用带有辅助注入(inject)的模拟对象而不是真正的实现类

java JTree取消选择一个已经被选中的节点

java - 弹出框-如何在selenium中处理它

java - 在通过 ProcessBuilder 运行的 C 程序中捕获信号