我遇到了一个Lucene索引,它索引了含有“ – ”字符的单词.
它适用于包含“ – ”但不是所有的一些单词,我没有找到原因,为什么它不工作.
我正在搜索的字段被分析,并且包含具有和不具有“ – ”字符的单词的版本.
我正在使用分析器:org.apache.lucene.analysis.standard.StandardAnalyzer
这里有一个例子:
如果我搜索“gsx- *”,我得到一个结果,索引的字段包含
“SUZUKI GSX-R 1000 GSX-R1000 GSXR”
但如果我搜索“v- *”,我没有结果.预期结果的索引字段包含:
“SUZUKI DL 1000 V-STROM DL1000V-STROMVSTROM V STROM”
如果我搜索“v-strom”而没有“*”它可以工作,但如果我只是搜索“v-str”,例如我没有得到结果. (应该是一个结果,因为它是一个网上商店的实时搜索)
那么2个预期结果有什么区别?为什么它适用于“gsx”,但不适用于“v-”?
解决方法
StandardAnalyzer将连字符视为空白,我相信.所以它将您的查询“gsx- *”转换为“gsx *”和“v- *”,因为也消除了单字母令牌.您在搜索结果中看到的字段内容是字段的存储值,它完全独立于为该字段编入索引的条款.
所以你想要的是“v-strom”作为一个整体来成为一个索引的术语. StandardAnalyzer不适合这种文本.也许可以与WhitespaceAnalyzer或SimpleAnalyzer一起去.如果仍然没有削减它,您也可以选择将自己的分析仪扔在一起,也可以选择将其分开,然后再进一步使用TokenFilters进行组合. the Lucene Analysis package Javadoc.提供了非常好的解释
BTW,没有必要输入索引中的所有变体,如V-strom,V-Strom等.这个想法是使同一个分析器将所有这些变体标准化为索引中的同一个字符串,同时解析查询.