我有以下代码:
Document doc = new Document();
String description = "This is a description text";
Field descField = new StringField("description ", description , Field.Store.YES);
doc.add(descField);
doc.add(new TextField("location", "Berlin", Field.Store.YES));
doc.add(new TextField("location", "Munich", Field.Store.YES));
doc.add(new TextField("location", "Vienna", Field.Store.YES));
writer.addDocument(doc);
该字段的位置如何'物理存储在Lucene?它是映射到一个单独的字段(内部保留偏移量)还是实际上有3个具有相同名称的字段分别存储在倒排索引中?
我实际上有这样的问题:如果我选择动态生成(例如从运行时的数据源)这些位置字段与将它们添加到a中相比,是否存在性能问题(运行时/空间)或其他问题单个字段,因此减少字段数总是只有两个(描述和位置)?
如果有人知道指针或答案,我们将不胜感激。
答案 0 :(得分:2)
它将映射到单个字段。这样:
doc.add(new TextField("location", "Berlin", Field.Store.YES));
doc.add(new TextField("location", "Munich", Field.Store.YES));
doc.add(new TextField("location", "Vienna", Field.Store.YES));
非常相同:
doc.add(new TextField("location", "Berlin Munich Vienna", Field.Store.YES));
(假设您使用的是StandardAnalyzer
)
您选择的内容应该在索引时没有明显区别,并且在您获得的搜索结果方面没有任何区别。
两者之间的区别在于它们存储的表示形式。单独添加它们时,您将能够将存储的结果返回到数组中,而不是字符串:
IndexableField[] locations = doc.getFields("location")
for (IndexableField location : location)
//Do stuff