我有一个包含歌曲名称和艺术家姓名的音乐目录,当有人搜索“madona”时,我希望他们能找到麦当娜的歌曲,如果他们只用一个“n”写“madona”就没关系。
在某处,我读到了同义词,然后我把一个带有同义词列表的文件,如下所示:
madona => madonna
metalica => metallica
这在schema.xml中:
<filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms.txt" ignoreCase="true" expand="true"/>
但没有结果。
我该怎么办?,请帮忙!
答案 0 :(得分:1)
我可以想到这些替代方案:
答案 1 :(得分:0)
同义词是一种可能的方法,但是当你想在运行时替换或附加其他查询词时,它是最合适的。例如,如果有人在搜索家具并输入关键字“沙发”,那么逻辑上可能也是“沙发”的同义词。这是同义词的预期用途。
在处理错误拼写和/或拼写错误时,这些情景通常最好通过词干来处理。词干需要一个术语(令牌)并将其缩减为该词的核心表示形式。不同的分析器可以使用各种令牌词干分析器将文本缩减为可以产生更有效搜索的内容,例如“madonna”和“madona”引用相同的文档。
词干回归到语言分析领域,所以它不是一个快速学习的学习周期。也就是说,您可以通过管理工具试用Solr中包含的不同分析器。根据您使用的Solr版本,菜单包含“分析”选项。此页面允许您选择任何基础Solr字段类型(以及您自己的架构中的任何一种),为索引和查询插入一些文本,并查看分析器生成的内容。您可能找不到您想要的确切内容,但Solr的可配置性允许您以不同的组合将它们连接在一起。一旦掌握了背景,就可以构建那些背景以满足您的特定用例。
答案 2 :(得分:0)
非常感谢大家!
我发现了一些有趣的同义词:列表应该包含令牌而不是单词,因此即使使用同义词,也没有预期的结果,因为麦当娜的索引标记是Madonn,为麦当娜查询生成的标记是madon,所以在同义词列表包括:
madon => madonn
只有这样才能得到结果。
至于使用另一个当前使用::
的解析器<!-- Portuguese -->
<fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_pt.txt" ignoreCase="true" expand="true"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" format="snowball" enablePositionIncrements="true"/>
<filter class="solr.SnowballPorterFilterFactory" language="Portuguese"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_pt.txt" ignoreCase="true" expand="true"/>
</analyzer>
</fieldType>