我正在构建一个Lucene索引并添加文档。
我有一个多值的字段,对于这个例子,我将使用Categories。
物品可以有很多类别,例如,牛仔裤可以属于服装,裤子,男士,女士等。
将字段添加到文档时,逗号会有所作为吗? Lucene会忽略它们吗?如果我将逗号更改为空格会有区别吗?这会自动使字段多值吗?
String categoriesForItem = getCategories(); // returns "category1, category2, cat3" from a DB call
categoriesForItem = categoriesForItem.replaceAll(",", " ").trim(); // not sure if to remove comma
doc.add(new StringField("categories", categoriesForItem , Field.Store.YES)); // doc is a Document
我这样做是否正确?还是有另一种方法来创建多值字段?
感谢任何帮助/建议。
答案 0 :(得分:19)
这是为每个文档索引multiValued字段的更好方法
String categoriesForItem = getCategories(); // get "category1, category2, cat3" from a DB call
String [] categoriesForItems = categoriesForItem.split(",");
for(String cat : categoriesForItems) {
doc.add(new StringField("categories", cat , Field.Store.YES)); // doc is a Document
}
每当一个文档中出现多个具有相同名称的字段时,反向索引和术语向量都会按照字段的添加顺序在逻辑上将字段的标记附加到另一个字段。
同样在分析阶段,两个不同的值将通过setPositionIncrementGap()自动分配位置增量。让我解释为什么需要这样做。
文档D1中的字段“类别”有两个值 - “foo bar”和“foo baz” 现在,如果你要做一个短语查询“bar foo”D1不应该出现。这是通过在同一字段的两个值之间添加额外增量来确保的。
如果您自己连接字段值并依赖分析器将其拆分为多个值,则“bar foo”将返回D1,这将是不正确的。
答案 1 :(得分:1)
如果您使用StandardAnalyzer,则可以使用逗号或空格。但是,如果你有另一个分析器,它取决于。
另一种方式:您可以在同一个字段中多次使用其他类别。然后我建议使用KeywordAnalyzer或者让它不被篡改,以便与你的类别名称完全匹配。