建议使用 ClassicAnalzer 索引包含产品代码(如“GSX-R1000”)的文本。它将将此视为一个单独的术语,并且不会拆分其部分。但例如文本“Europe/Berlin”将被 ClassicAnalzer 拆分为“Europe”和“Berlin”两个词。这意味着如果您有一个由 ClassicAnalyzer 索引的文本,其中包含该短语
Europe/Berlin GSX-R1000
您可以搜索“欧洲”、“柏林”或“GSX-R1000”。
但请注意您用于搜索的分析器。我认为搜索 Lucene 索引的最佳选择是 KeywordAnalyzer。使用 KeywordAnalyzer,您还可以搜索文档中的特定字段,并且可以构建复杂的查询,例如:
(processid:4711) (berlin)
此查询将搜索带有短语“berlin”的文档,以及包含数字 4711 的字段“processid”。
但是,如果您在索引中搜索“欧洲/柏林”这个短语,您将得不到任何结果!这是因为 KeywordAnalyzer 没有更改您的搜索词组,但“Europe/Berlin”这个词组被 ClassicAnalyzer 分成了两个单独的词。这意味着您必须分别搜索“欧洲”和“柏林”。
要解决此冲突,您可以使用以下代码在适合您需要的搜索查询中翻译用户输入的搜索词:
QueryParser parser = new QueryParser("content", new ClassicAnalyzer());
Query result = parser.parse(searchTerm);
searchTerm = result.toString("content");
此代码将翻译 serach 短语
Europe/Berlin
进入
europe berlin
这将产生预期的文档集。
注意:这也适用于更复杂的情况。搜索词
Europe/Berlin GSX-R1000
将被翻译成:
(europe berlin) GSX-R1000
这将使用 KeyWordAnalyzer 正确搜索所有组合的短语。