如何让 Solr/Lucene 忽略空间?我想要实现的是让搜索引擎匹配搜索短语,例如,ie。仅索引“香港”时的“香港”。
据我所知,我应该使用一些文本分析器。我找不到任何描述这种方法的好资料。
谢谢!
如何让 Solr/Lucene 忽略空间?我想要实现的是让搜索引擎匹配搜索短语,例如,ie。仅索引“香港”时的“香港”。
据我所知,我应该使用一些文本分析器。我找不到任何描述这种方法的好资料。
谢谢!
您可以使用 ShingleFilterFactory 创建单词组合。您需要设置 tokenSeparator="" 以删除标记之间的空间。如果您仍想搜索单个单词,您可能希望保留 outputUnigrams=true。
<fieldType name="text_shingle" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="2"
outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=""/>
</analyzer>
</fieldType>
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory
不过你需要小心。ShingleFilter 将为文档中的所有内容创建组合。例如“need to be carel”会产生“needto becareful”。. 这个例子看起来不错让我们看看这个:“Are the eaters also”将产生“arethe Theaterseatersalso”。查询“剧院”将导致误报命中。
如果您要索引短文档,例如人名,那么我当然建议使用 ShingleFilter,因为组合总是用于人名。但是,如果您正在索引文档,则需要知道您正在组合什么。在这种情况下,同义词过滤器可能更适合。您可以从字典创建组合并将它们与 SynonymFilterFactory 一起使用。
您的案例中的搜索条件不同。
您需要使用solr.SynonymFilterFactory并将此组合定义为同义词。
查看上面链接中的示例。
这将使您能够同时搜索 hong kong 和 hongkong 并仍然得到结果。
通常WordDelimiterFilterFactory将用于没有空格的组合。
它用于诸如更改大小写或字母数字组合之类的情况,您希望使用任何组合进行搜索。
例如
,Wi-fi 应该可以通过 wifi、wifi、wi fi 等搜索 ....
iPhone 应该可以搜索为 iphone、iPhone、i phone 等...
j2se 可以通过 j2se、j 2 se 等搜索...
你必须知道这些空格什么时候相关,所以你有单词列表,你应该使用同义词......参见SynonymFilterFactory的文档