“-”字符的 Lucene Index 问题

2022-09-02 21:13:07

我在使用Lucene索引时遇到问题,该索引包含包含“-”字符的索引单词。

它适用于一些包含“-”的单词,但不适用于所有单词,我没有找到原因,为什么它不起作用。

我正在搜索的字段经过分析,并包含带有和不带有“-”字符的单词版本。

我正在使用分析器:org.apache.lucene.analysis.standard.StandardAnalyzer

这里有一个例子:

如果我搜索“gsx-*”我得到了一个结果,索引字段包含“铃木GSX-R 1000 GSX-R1000 GSXR”

但是如果我搜索“v-*”,我没有得到任何结果。预期结果的索引字段包含:“铃木DL 1000 V-STROM DL1000V-STROM V STROM”

如果我搜索“v-strom”而不搜索“*”,它可以工作,但是如果我只是搜索“v-str”,例如,我没有得到结果。(应该有一个结果,因为它是为了实时搜索网店)

那么,2个预期结果之间有什么区别呢?为什么它适用于“gsx-”而不适用于“v-”?


答案 1

我相信,标准分析器会将连字符视为空格。因此,它会将您的查询转换为无,因为 at 还消除了单字母标记。您在搜索结果中看到的字段内容是字段的存储值,它与为该字段编制索引的术语完全无关。"gsx-*""gsx*""v-*"

所以你想要的是“v-strom”作为一个整体成为一个索引术语。 不适合这种类型的文本。也许可以尝试一下 或 .如果这仍然没有解决问题,您还可以选择将自己的分析仪放在一起,或者只是从这两个模板开始,然后用进一步的方法组合它们。Lucene Analysis软件包Javadoc给出了一个很好的解释。StandardAnalyzerWhitespaceAnalyzerSimpleAnalyzerTokenFilters

顺便说一句,无需在索引中输入所有变体,如V-strom,V-Strom等。这个想法是让同一个分析器在索引中和分析查询时将所有这些变体规范化为同一字符串。


答案 2

ClassicAnalyzer 将“-”作为有用的非分隔符字符进行处理。根据我对ClassicAnalyzer的理解,它像3.1之前的StandardAnalyzer一样处理'-',因为ClassicAnalyzer使用ClassicTokenizer将带有嵌入式'-'的数字视为产品代码,因此整个事情被标记为一个术语。

当我在Regentstrief Institute时,我在升级Luke后注意到了这一点,因为LOINC标准医学术语(LOINC由R.I.发起)由一个数字后跟一个“-”和一个校对位来标识,比如“1-8”或“2857-1”。我在 Luke 3.5.0 中使用 StandardAnalyzer 搜索 LOINC(如 '45963-6')失败,但在 ClassicAnalyzer 上成功(这是因为我们用 2.9.2 Lucene.NET 构建索引)。