Java 在Lucene文档中添加多值字符串字段,逗号是否重要?

Java 在Lucene文档中添加多值字符串字段,逗号是否重要?,java,lucene,Java,Lucene,我正在建立一个Lucene索引并添加文档 我有一个多值字段,在这个示例中,我将使用类别 一个项目可以有许多类别,例如,牛仔裤可以归入服装、裤子、男式、女式等 在文档中添加字段时,逗号是否起作用?Lucene会无视它们吗?如果我将逗号改为空格,会有区别吗?这是否会自动使字段具有多值性 String categoriesForItem = getCategories(); // returns "category1, category2, cat3" from a DB call categori

我正在建立一个Lucene索引并添加文档

我有一个多值字段,在这个示例中,我将使用类别

一个项目可以有许多类别,例如,牛仔裤可以归入服装、裤子、男式、女式等

在文档中添加字段时,逗号是否起作用?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
我这样做对吗?还是有其他方法可以创建多值字段


非常感谢您的帮助/建议。

如果您使用StandardAnalyzer,可以使用逗号或空格。但如果你有另一台分析仪,那就要看情况了


另一种方法:同一字段中可以多次包含另一个类别。然后我建议使用KeywordAnalyzer,或者让它不加密,以便与您的类别名称完全匹配。

这将是为每个文档的多值字段编制索引的更好方法

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中的字段“categories”有两个值——“foo bar”和“foo baz” 现在,如果要进行短语查询,“bar foo”D1不应该出现。这是通过在同一字段的两个值之间添加额外增量来确保的


如果您自己连接字段值并依靠分析器将其拆分为多个值,“bar foo”将返回D1,这将是不正确的。

我使用的是最新的lucene(目前为4.6),与您真正的问题无关,但字段是否必须存储?更像是在“裤子”类别下搜索物品,而不是搜索牛仔裤并检索其所有类别,不是吗?嗯,我想支持这两种搜索。搜索产品并获取其类别(作为添加的过滤器),搜索类别下的项目并获取其产品。我是Lucene的新手,所以我不确定是否存储该字段,所以我默认存储它。我建议创建两个索引,一个用于类别,另一个用于项目,它们将运行得更快。谢谢。这很有帮助,但你能详细说明一下吗?或者给我指一个更详细的链接?@EliteOctagon他指的是@EliteOctagon我会看看StandardAnalyzer的文档。然后你知道你的文本是如何被分割成什么样的标记的。如果类别名称准确(即区分大小写)对您很重要,那么请使用多个字段,不要让他们进行分析。还有一件事@varunthacker,我以后如何在文档中检索此字段的所有值?当我做doc.getField(“store_number”).toString()时,它只给我一个值,最后一个插入的值。这是一个新问题:这个方法并没有真正使字段多值化,它只是具有相同名称的多个字段。如果要使其正常工作,可能需要将分析器中的位置增量间隙设置为不同于0的值。您可以通过使用生成器或覆盖Analyzer中的getPositionIncrementGap来实现这一点