我正在构建一个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
Run Code Online (Sandbox Code Playgroud)
我这样做了吗?还是有另一种方法来创建多值字段?
任何帮助/建议表示赞赏.
var*_*ker 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
}
Run Code Online (Sandbox Code Playgroud)
每当具有相同名称的多个字段出现在一个文档中时,反向索引和术语向量将按照添加字段的顺序逻辑地将字段的标记附加到彼此.
同样在分析阶段,两个不同的值将通过setPositionIncrementGap()自动分配位置增量.让我解释为什么需要这样做.
文档D1中的字段"类别"有两个值 - "foo bar"和"foo baz"现在如果你要做一个短语查询"bar foo"D1不应该出现.这是通过在同一字段的两个值之间添加额外增量来确保的.
如果您自己连接字段值并依赖分析器将其拆分为多个值,则"bar foo"将返回D1,这将是不正确的.