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